初学者:正确的种子.rails中的Rb 3



我刚刚创建了两个模型和一个"连接表"。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"

最新更新