我刚创建了两个模型和一个“连接表”。人,地址(create_adresses_personss)
class Person < ActiveRecord::Base
has_and_belongs_to_many :streets
end
class Street < ActiveRecord::Base
has_and_belongs_to_many :persons
end
现在我想在db / seeds.rb文件中向这些模型添加一些数据。我遵循的教程只是添加了对象:
person = Person.create :name => 'Dexter'
street.create[{:streetname => 'street1'},
{:streetname => 'street2'},
{:streetname => 'julianave'},
{:streetname => 'street3'}]
问题1:为什么人们的数据增加不同于街道?是仅仅是教程想要表明在seeds.rb中添加数据的方法有很多种?
问题2:教程没有在seeds.rb中建立连接/连接。它在rails控制台中执行;
>>p1 = Person.find(1)
>>s1 = Street.find(1)
>>p1.streets << s1
不能在seeds.rb文件中建立theese连接吗?
问题3:使用“富有多个联盟 - 关联”加入会更好吗?
感谢您的时间和对初学者的耐心;)
答案 0 :(得分:3)
1)第一种方法是创建一个对象。第二种方法是创建多个对象。但是,对于第二种方法,您需要执行Street.create
,而不是street.create
。
2)是的,您可以在种子文件中以相同的方式执行此操作。
3)你所谈论的“丰富的多对多”是一个与加入模型的关联,我猜你正在谈论。这只是一个连接表,这是has_and_belongs_to_many
所做的。要使用联接模型,您需要查找has_many :through
。通常认为总是使用正确的连接模型会更好,但是当我只需要快速,简单的关联时,我仍然使用HABTM。 has_many :through
允许更多选项和更多灵活性,但设置稍微复杂一点(尽管如此)。这是你的决定。
答案 1 :(得分:2)
我喜欢为多对多关联创建种子数据的一种方法是设置其中一个模型,添加一个通过关联设置其他模型的点击块。
Person.create!(:name => "Fubar").tap do |person|
3.times do |n|
person.streets.create!(:streetname => "street #{n}")
end
# OR
person.streets.create!([
{:streetname => "street 1"},
{:streetname => "street 2"},
... and so on
])
end
所有点击正在执行的是以对象作为唯一参数执行块。我觉得种子很方便。
我要抛弃的另一个提示是将您的模型属性名称与带下划线的单词间隔开。
:street_name instead of :streetname
当您开始想要使用某些带有模型属性的ActiveSupport衔接器并将它们转换为用于UI的文本字符串时,差异会更大。 Ë :streetname.to_s.titleize#“Streetname” :street_name.to_s.titleize#“街道名称”
最后一个挑剔,你可能希望你的联接表是地址_人不是地址_人,因为rais变形器会使人多元化。对于Person模型,PeopleController而不是PersonsController,您的控制器也是如此。虽然也许它也适用于人。
:person.to_s.pluralize # "people"
:people.to_s.singularize # "person"
:persons.to_s.singularize # "person"