5

我正在尝试创建一个系统,让我的网站的用户可以收藏页面。这些页面有两种类型,俱乐部或运动。所以,我有四个模型,关联如下:

用户模型:

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

本质上,用户通过收藏有_许多运动或俱乐部,收藏、运动和俱乐部之间的关联是多态的。

在实践中,这一切都完全按照我想要的方式工作,并且我设计的整个系统都可以正常工作。但是,我在我的网站上使用 Rails_Admin,并且在三个地方出现错误:

  1. 第一次加载仪表板 (/admin) 时。如果我刷新页面,它工作正常。
  2. 在 Rails_Admin 中加载用户模型时
  3. 在 Rails_Admin 中加载收藏夹模型时

/admin/user 这是(gist)上的错误消息。所有错误都是相似的,引用ActiveRecord::Reflection::ThroughReflection#foreign_key delegated to source_reflection.foreign_key, but source_reflection is nil:.

谁能指出我正确的方向,以便我解决这个问题?我到处搜索,并询问了其他程序员/专业人士,但没有人能在我的模型中发现错误。非常感谢!

4

2 回答 2

13

好吧,好吧,我终于解决了这个问题,并认为我会发布修复以防万一它在未来帮助其他人(没有人喜欢找到其他有同样问题但没有发布答案的人)。

事实证明,使用多态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

这个关于多态关联的另一个问题的答案has_many :through帮助我弄清楚了这一点。

于 2013-05-29T02:29:11.613 回答
4

当代码包含一个不存在的关联的 has_many 时(重构中),我遇到了这个错误。所以它也可能是由一些一般的 has_many 配置错误引起的。Ruby/Rails 代码从不关心,因为 Ruby 的动态风格意味着关联只在需要时调用。但是 Rails-Admin 会彻底检查属性,导致反射问题。

于 2013-08-21T11:16:48.890 回答