2011-10-09 42 views
3

我刚刚创建了两个模型和一个“连接表”。人,ADRESS(create_adresses_personss)BEGINNER:在rails 3中更正seeds.rb

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中创建连接/连接。它在轨道控制台中这样做;

>>p1 = Person.find(1) 
>>s1 = Street.find(1) 
>>p1.streets << s1 

不能theese连接在seeds.rb文件中进行?

问题3:用“rich many_to_many-assocciation”做这个连接会更好吗?

感谢您的时间和耐心与初学者)

回答

3

1)第一种方法是创建一个对象。第二种方法是创建多个对象。但是,对于第二种方法,您需要执行Street.create,而不是street.create

2)是的,你可以用同样的方法在种子文件中做到这一点。

3)你所说的“丰富的多对多”与加入模型有关联,我猜你在谈论。这与仅仅是连接表相反,has_and_belongs_to_many就是这样做的。要使用连接模型,您需要查找has_many :through。总是认为总是使用适当的连接模型会更好,但是当我只需要快速,简单的关联时,我仍然使用HABTM。 has_many :through允许更多的选择和更多的灵活性,但是它的设置稍微复杂一点(虽然没有那么多)。是你的决定。

+0

谢谢布里克! –

2

我喜欢为多对多关联创建种子数据的一种方法是设置其中一个模型,添加一个通过关联设置其他模型的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所做的都是用对象执行块,因为它只是参数。我发现种子很方便。

另一个我会抛出的技巧将有你的模型属性名称与下划线的单词间隔。

:street_name instead of :streetname 

的差异,当你开始想要使用一些模型需要的属性和把它们变成文本字符串在UI使用的ActiveSupport helers的更为深刻。 è :streetname.to_s.titleize#“Streetname” :street_name.to_s.titleize#“街道名称”

而最后一个鸡蛋里挑骨头,你可能希望你的连接表是addresses_people不addresses_persons因为RAIS偏转是将人复数化为人。 Person模型PeopleController代替PersonsController的控制器也一样。虽然也许它也会与人合作。

:person.to_s.pluralize # "people" 
:people.to_s.singularize # "person" 
:persons.to_s.singularize # "person"