2014-02-16 103 views
0

我想为我的模型找到正确的关联,但无法弄清楚。Rails协会模型

我有3种型号,BatManufacturer,& Review。这里是我的模型:

class Bat < ActiveRecord::Base 
    has_many :reviews 
    has_one :manufacturer 
end 

class Manufacturer < ActiveRecord::Base 
    has_many :bats 
end 

class Review < ActiveRecord::Base 
    belongs_to :bat 
end 

在审查模式,它有一个bat_id & manufacturer_id场。在蝙蝠模型中,它有一个manufacturer_id字段。

我想正确地将制造商模型链接到蝙蝠模型上。我看过http://guides.rubyonrails.org/association_basics.html#self-joins,我不确定那是我需要的那种类型的关系。

这是正确的还是我错过了什么?

回答

1

正如您通过自加入文档所看到的,自加入用于将模型加入到自身中。您不需要这样做,因为制造商不以任何方式属于其他制造商(至少,不是从我的描述中可以看出的)。

此外,您的评论模型不需要被链接到制造商模型(又名,你不需要审查模式manufacturer_id

你的蝙蝠模型应该有belongs_to :manufacturer,因为它属于制造商,它没有一个你可以阅读更多关于belongs_to VS has_one此:http://guides.rubyonrails.org/association_basics.html#choosing-between-belongs-to-and-has-one

所有你需要的是你的蝙蝠表manufacturer_id,并在您的审查表bat_id然后你就可以使用所有Rails魔术,就像

bat.manufacturer # get the manufacturer of a bat 
manufacturer.bats # get all the bats from a manufacturer 
bat.reviews # get all the reviews for a bat 

很显然,您需要创建迁移到田里你的蝙蝠类添加到数据库中,如

rails generate migration add_manufacturer_id_to_bat manufacturer_id:integer 
rails generate migration add_bat_id_to_review bat_id:integer 
rake db:migrate 
+0

好感谢。我在我的评论表中使用了manufacturer_id,因为它允许我使用两个下拉选择来设置表单。在一个下拉菜单中,用户选择制造商,在另一个下拉菜单中选择球棒名称。我想使用JavaScript(基于http://www.chasepursley.com/dynamic-select-slash-dropdown-menus-with-rails-3-plus-on-the-client-side)来允许一个好的用户界面。如果仅基于动态下拉列表将bat_id存储在评论表中将会很好,但我无法弄清楚。 (这就是为什么我有bat_id&manufacturer_id) – Daniel

+0

我一直想弄清楚如何解决这个问题在这里http://stackoverflow.com/questions/21690556/rails-multiple-input-field-in-form-to-one -integer-attribute-in-model – Daniel

+0

我无法使'bat.manufacturer'工作,只有'bat.manufacturer_id'会显示整数。 – Daniel

0

因为您的制造商有很多蝙蝠,您的蝙蝠属于一个制造商,所以我认为更改has_one :manufacturerbelongs_to :manufacturer将解决您的问题。

-1

更改为这是有道理的

class Bat < ActiveRecord::Base 
    has_many :reviews 
    belongs_to :manufacturer 
end 
+0

这个答案是正确的。该op说,蝙蝠“有一个制造商”,而制造商“有很多蝙蝠”。每个'has_many'或'has_one'需要在另一个模型上有一个'belongs_to'对应。在模型关联的两端不能有两个'has_ *'。 – ahnbizcad