4

我試圖創建一個系統,我的網站的用戶可以收藏頁面。這些網頁有兩種類型,不管是俱樂部還是體育。所以,我有四個型號,因此相關:has_many源反射錯誤:通過

用戶模型:

class User < ActiveRecord::Base 
    .. 
    has_many :favorites 
    has_many :sports, :through => :favorites 
    has_many :clubs,  :through => :favorites 
    .. 
end 

收藏夾型號:

class Favorite < ActiveRecord::Base 
    .. 

    belongs_to :user 
    belongs_to :favoritable, :polymorphic => true 

end 

俱樂部型號:

class Club < ActiveRecord::Base 
    .. 

    has_many :favorites, :as => :favoritable 
    has_many :users, :through => :favorites 

    def to_param 
     slug 
    end 
end 

運動型號:

class Sport < ActiveRecord::Base 
    .. 

    def to_param 
     slug 
    end 

    .. 

    has_many :favorites, :as => :favoritable 
    has_many :users,  :through => :favorites 

    .. 
end 

基本上,用戶has_many通過收藏夾運動或俱樂部,而收藏夾,運動和俱樂部之間的關聯是多態的。

實際上,這一切都按照我想要的方式工作,並且我設計的整個系統都能正常工作。但是,我在我的網站上使用Rails_Admin,並在三處出現錯誤:

  1. 第一次加載儀表板(/ admin)時。如果我刷新頁面,它工作正常。
  2. 當加載在Rails_Admin
  3. User模型當Rails_Admin

加載收藏模型這裏是關於/admin/user(gist)的錯誤消息。所有的錯誤都是相似的,參考ActiveRecord::Reflection::ThroughReflection#foreign_key delegated to source_reflection.foreign_key, but source_reflection is nil:

任何人都可以在正確的方向指向我,以便我可以解決這個問題嗎?我搜遍了所有,並問其他程序員/專業人士,但沒有人可以發現我的模型中的錯誤。非常感謝!

回答

10

好的,好吧,我終於搞清楚了,並且認爲我會發布修復以防萬一以後幫助其他人(沒有人喜歡找到其他人有相同的問題並且沒有發佈的答案) 。

事實證明,使用多態性has_many :through,需要更多的配置。我的用戶模型應該是這個樣子的:

class User < ActiveRecord::Base 
    .. 
    has_many :favorites 
    has_many :sports, :through => :favorites, :source => :favoritable, :source_type => "Sport" 
    has_many :clubs, :through => :favorites, :source => :favoritable, :source_type => "Club" 
    .. 
end 

This answer約多態性has_many :through協會的另一個問題是什麼讓我摸不着頭腦。

+0

作爲進一步的調試線索:當我有一個關聯的自定義名稱時發生在我身上。我的User類使用了has_many,我通過指定source作爲自定義關聯名稱以及源類型作爲我的自定義關聯的類名來解決它。很好的回答@alexlafroscia! – corvuszero

4

當代碼包含不存在的關聯has_many(中重構)時,我遇到了此錯誤。所以它也可能是由一些常見的has_many錯誤配置引起的。 Ruby/Rails代碼從不關心,因爲Ruby的動態風格意味着僅在需求時調用關聯。但Rails-Admin徹底檢查屬性,導致反射問題。