我一直试图找到一个关于如何在我的模型之间建立关联的明确例子。我一直在使用Populator和Faker来批量创建虚拟日期,但是当涉及到各种关联时,我无法找到任何不涉及手动创建它们的示例。
例如我有两个模型,Facility和Venue。 设施属于Venue,Venue有许多设施
我根据自述文件尝试了这个:
Venue.delete_all
Facility.delete_all 'Side note: Can I combine these somehow?'
Venue.populate 20 do |venue|
venue.name = Faker::Name.title
venue.description = Faker::Lorem.paragraph(12)
Facility.populate 3..8 do |facility|
facility.venue_id = venue.id
facility.name = Faker::Name.title,
facility.description = Faker::Lorem.sentence
end
end
这对每个场地都有效,它将创建3到8个设施......听起来很棒,在数据库中,venue_id得到了正确的分配。但是在控制台中,当我Facility.first.venue
时,我得到一个空数组。如果我Facility.first.venue_id
,我会获得一个ID,但他们并没有真正地{'从我所知道的相关联。
请问正确的方法是什么?
答案 0 :(得分:1)
20.times do
name = Faker::Name.title
description = Faker::Lorem.paragraph(12)
venue = Venue.create!(name: name, description: description)
rand(3..8).times do
name = Faker::Name.title
description = Faker::Lorem.sentence
facility = Facility.new(name: name, description: description)
facility.venue = venue
facility.save!
end
end
另外,要回答您的旁注问题,dependent: :destroy
允许您在父母被销毁时删除所有子女:
class Venue < ActiveRecord::Base
has_many :facilities, dependent: :destroy
end
class Facility < ActiveRecord::Base
belongs_to :customer
end
答案 1 :(得分:0)
我更喜欢将创建对象的ID分配给具有多个对象的ID。
在 Venue 模型上使用has_many :facilities, dependent: destroy
就足以在 Venue 消失后销毁所有这些内容:
Venue.destroy_all
20.times do |t|
v = Venue.new(name: "title_#{t}", description: "a descr #{t}")
v.facility_ids = rand(3..8).times do |t|
Facility.create!(name: "name_#{t}", description: "sentence_#{t}").try(:id)
end.compact
v.save
end
在过去,我使用了Viget团队的一个不错的宝石:Sprig
它允许您使用 yml 指定种子。如果你做了很多播种就试一试。