我刚刚创建了两个模型和一个"连接表"。Person, address (create_addresses_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
这些联系不能在种子中产生吗?rb文件?
问题3:用"rich many_to_many- association"来做这个连接会更好吗?
感谢您的时间和耐心的初学者;)
1)第一个方法是创建一个对象。第二种方法是创建多个对象。然而,对于第二种方法,您需要执行Street.create
,而不是street.create
。
2)是的,你可以在种子文件中这样做。
3)你所说的"富多对多"是与Join模型的关联,我猜你说的是。这与has_and_belongs_to_many
所做的连接表相反。要使用连接模型,您需要查找has_many :through
。通常认为最好总是使用适当的连接模型,但是当我只需要快速、简单的关联时,我仍然使用HABTM。has_many :through
允许更多的选项和更大的灵活性,但它的设置有点复杂(虽然不是那么复杂)。这是你的决定。
我喜欢为多对多关联创建种子数据的一种方法是设置其中一个模型,然后添加一个tap块,该tap块通过该关联设置其他模型。
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
tap所做的就是用对象作为它唯一的参数来执行block。我觉得种籽很方便。
我要抛出的另一个技巧是让模型属性名在带下划线的单词之间间隔。
:street_name instead of :streetname
当你开始想要使用一些activessupporthelper时,差异就更大了,这些helper接受模型属性并将它们转换为文本字符串以供UI使用。e: streetname.to_s。titleize #"街名": street_name.to_s。title # "街道名称"
最后一个问题,您可能希望连接表是addresses_people而不是addresses_persons,因为rais影响因子将person复数化为people。对于Person模型上的控制器也是一样,PeopleController而不是PersonsController。虽然它可能也适用于人。
:person.to_s.pluralize # "people"
:people.to_s.singularize # "person"
:persons.to_s.singularize # "person"