Rails 4 如何使用 seeds.rb 填充连接 table
Rails 4 how to populate join table using seeds.rb
我正在练习 Rails。我想为他们提供消息和标签(单个消息应该有很多标签,单个标签应该有很多消息)。我有 2 个相关模型:Messages 和 Tags。它们使用 has_and_belongs_to_many 关联。我正在使用 ffaker 来填充 tables
型号:
留言:
class Message < ActiveRecord::Base
has_many :comments, dependent: :destroy
has_and_belongs_to_many :tags
end
标签:
class Tag < ActiveRecord::Base
has_and_belongs_to_many :messages
end
迁移:
消息:
class CreateMessages < ActiveRecord::Migration
def change
create_table :messages do |t|
t.text :content
t.timestamps
end
end
end
标签:
class CreateTags < ActiveRecord::Migration
def change
create_table :tags do |t|
t.string :title
end
end
end
加入table:
class CreateMessagesTagsJoinTable < ActiveRecord::Migration
def change
create_table :messages_tags, id: false do |t|
t.references :tag, index: true
t.references :message, index: true
end
end
end
种子文件:
5.times { Message.create([content: FFaker::CheesyLingo.paragraph]) }
Message.all.each do |msg|
rand(4).times { Comment.create([content: FFaker::CheesyLingo.sentence, message_id: msg.id]) }
2.times { msg.tags.create([title: FFaker::HipsterIpsum.word.gsub(' ','-').downcase]) }
end
评论无关紧要。因此,首先我要在此处填充消息 table。其次,我从消息内部填充标签 table。我最终得到的是填充的消息和标签 table,其中每条消息都有 2 个标签。
现在,问题来了:
如何将已创建的标签关联到消息,反之亦然?我知道如何通过创建它们来做到这一点,但现在我想将几个标签关联到单个消息。我还想将几条消息关联到单个已创建的标签。
如何做到这一点,语法是什么?
这应该有效
Message.all.each do |msg|
rand(4).times { Comment.create([content: FFaker::CheesyLingo.sentence, message_id: msg.id]) }
tags = 2.times { msg.tags.create([title: FFaker::HipsterIpsum.word.gsub(' ','-').downcase]) }
msg.tags = tags
end
或者您可以手动完成
msg = Message.first
tag = Tag.first
tag.messages << msg
# or
msg.tags << tag
我正在练习 Rails。我想为他们提供消息和标签(单个消息应该有很多标签,单个标签应该有很多消息)。我有 2 个相关模型:Messages 和 Tags。它们使用 has_and_belongs_to_many 关联。我正在使用 ffaker 来填充 tables
型号:
留言:
class Message < ActiveRecord::Base
has_many :comments, dependent: :destroy
has_and_belongs_to_many :tags
end
标签:
class Tag < ActiveRecord::Base
has_and_belongs_to_many :messages
end
迁移:
消息:
class CreateMessages < ActiveRecord::Migration
def change
create_table :messages do |t|
t.text :content
t.timestamps
end
end
end
标签:
class CreateTags < ActiveRecord::Migration
def change
create_table :tags do |t|
t.string :title
end
end
end
加入table:
class CreateMessagesTagsJoinTable < ActiveRecord::Migration
def change
create_table :messages_tags, id: false do |t|
t.references :tag, index: true
t.references :message, index: true
end
end
end
种子文件:
5.times { Message.create([content: FFaker::CheesyLingo.paragraph]) }
Message.all.each do |msg|
rand(4).times { Comment.create([content: FFaker::CheesyLingo.sentence, message_id: msg.id]) }
2.times { msg.tags.create([title: FFaker::HipsterIpsum.word.gsub(' ','-').downcase]) }
end
评论无关紧要。因此,首先我要在此处填充消息 table。其次,我从消息内部填充标签 table。我最终得到的是填充的消息和标签 table,其中每条消息都有 2 个标签。
现在,问题来了:
如何将已创建的标签关联到消息,反之亦然?我知道如何通过创建它们来做到这一点,但现在我想将几个标签关联到单个消息。我还想将几条消息关联到单个已创建的标签。 如何做到这一点,语法是什么?
这应该有效
Message.all.each do |msg|
rand(4).times { Comment.create([content: FFaker::CheesyLingo.sentence, message_id: msg.id]) }
tags = 2.times { msg.tags.create([title: FFaker::HipsterIpsum.word.gsub(' ','-').downcase]) }
msg.tags = tags
end
或者您可以手动完成
msg = Message.first
tag = Tag.first
tag.messages << msg
# or
msg.tags << tag