Rails中的种子关联

时间:2015-07-17 15:02:26

标签: ruby-on-rails ruby ruby-on-rails-4

我一直试图找到一个关于如何在我的模型之间建立关联的明确例子。我一直在使用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,但他们并没有真正地{'从我所知道的相关联。

请问正确的方法是什么?

2 个答案:

答案 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 指定种子。如果你做了很多播种就试一试。