2014-02-22 28 views
1

設置對象我在Rails的3.2一類我們稱之爲富稱爲酒吧(均爲ActiveRecords)另一類是HAS_ONE像這樣:訪問和使用Rails的ActiveRecord的

class Bar < ActiveRecord::Base 
attr_accessible :name 
end 


class Foo < ActiveRecord::Base 
    has_one :bar 

    def bar_name 
    if bar 
     bar.name 
    else 
     nil 
    end 
end 

當我打電話bar_name我得到一個MySQL錯誤,像這樣:

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'bar.foo_id' in 
'where clause': SELECT `bar`.* FROM `bar` WHERE `bar`.`foo_id` = 1 LIMIT 1 

我的問題是,爲什麼是Rails的嘗試選擇由Foo的ID欄時,我顯然希望通過bar_id的Foo的屬性欄。

請讓我知道這是否需要更多的解釋。

回答

5

隨着has_one關聯外鍵被放置在referenced model(Bar)而不是declaring model(Foo)。所以,在你的情況下,rails預計Bar模型中的外鍵爲Bar.foo_id。這是錯誤消息中查詢的原因。

如果您希望在其他型號上使用declaring model的外鍵,則需要使用belongs_to,如果需要使用has_one

如果你想在foreign_key如美孚然後bar_id,

你既可以走了belongs_to :bar在富模式

或者

在酒吧模型中的has_one :foo

+0

呃......那個工作,但措辭似乎有點反直覺,我在數據庫中考慮富'has_one'鍵引用欄和酒吧沒有foo的知識。無論如何,謝謝:) – onetwopunch

1

它看起來像你有你的關係倒退。在你的情況下,class Foo應該有belongs_to :bar而不是has_one :bar

class Foo < ActiveRecord::Base 
    belongs_to :bar 

    ... 

end 

在具有其他表的鍵的關係表總是在聯想使用belongs_to。有關belongs_to協會(和協會一般)的更多信息,請參見:

http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association