2013-05-04 140 views
1

我有建築,公寓,住宅和用戶,因爲某些原因沒有很好地在一起玩。不知道我錯過了什麼。關聯在Rails 3.2中失敗ActiveRecord :: InverseOfAssociationNotFoundError

class Building < ActiveRecord::Base 
    attr_accessible ... 

    has_many :apartments, inverse_of: :building 
    ... 
end 


class Apartments < ActiveRecord::Base 
    ... 
    belongs_to :building, inverse_of: :apartment 
    has_many :residences, inverse_of: :apartment 
    ... 
end 


class Residence < ActiveRecord::Base 
    ... 
    belongs_to :apartment, inverse_of: :residence 
    belongs_to :user, inverse_of: :residence 
    ... 
end 


class User < ActiveRecord::Base 
... 
    has_many :residences, inverse_of: :user 
... 
end 

在軌道控制檯我有負相關的問題:

a.class

=>公寓(ID:整數,building_id:整數,...,created_at:日期時間,的updated_at:日期時間)

a.building

的ActiveRecord :: InverseOfAssociationNotFoundError:找不到用於構建逆協會:從/Users/[me]/.rvm/gems/ruby-1.9.3-p194 (在大樓公寓) @ r3t2/gems/activerecord-3.2.8/lib/active_record/reflection.rb:246:在`check_validity_of_inverse!'中

h.class

=>住宅(ID:整數,apartment_id:整數,USER_ID:整數...,created_at:日期時間,的updated_at:DATETIME)

h.user

的ActiveRecord :: InverseOfAssociationNotFoundError:找不到反向關聯用戶(:用戶駐留) from /Users/[me]/.rvm/gems/[email protected]/gems/activerecord-3.2.8/lib/active_record/reflection.rb: 246:在`check_validity_of_inverse!'中

我可以繼續。這些類別之間的關係似乎正在逆轉。在過去的幾個小時裏,我嘗試了各種迭代,但終於打電話給「媽媽!」將超級感謝任何線索。

+0

爲什麼即使使用':inverse_of'? Rails將爲你的情況確定反向關係,其中':belongs_to'和':has_many'聲明的名稱與它們的類匹配。 – GoZoner 2013-05-04 20:20:16

+0

嗯...我以爲我已經嘗試過這些關聯沒有反轉,並得到了同樣的錯誤,但它似乎現在工作。謝謝,@GoZoner!將您的評論置於答案中,如果您認爲我的可憐問題值得您付出努力,我會選擇它... – BenU 2013-05-04 20:30:38

回答

1

爲什麼要使用:inverse_of? Rails會爲你的情況確定反向關係,其中:belongs_to和:has_many聲明的名稱與他們的類匹配。

+3

它在哪裏記錄? [doc](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Bi-directional+associations)說:「默認情況下,Active Record不知道任何有關這些反向關係的信息」 – 2013-05-04 20:42:00

+0

請閱讀此答案http://stackoverflow.com/a/9297745/1116374它有一個答案爲您的問題「爲什麼甚至使用:inverse_of?」 – Skydan 2014-01-22 21:20:37

+0

@Skydan,你讀過第二句話了嗎?對於他的情況,他甚至不需要使用':inverse_of',事實上,因爲他有一個錯字,他打破了Rails自動計算':inverse_of'的軌跡。 – GoZoner 2014-01-22 23:21:49

7

Building公寓協會是複數,所以你應該添加一個s

class Apartments < ActiveRecord::Base 
    ... 
    belongs_to :building, inverse_of: :apartments 
    has_many :residences, inverse_of: :apartment 
    ... 
end 
+0

謝謝,@MichaëlWitrant。這可能是我今後需要使用'inverse_of'的解決方案。 – BenU 2013-05-05 00:17:32