4

我今天遇到了一些魔法,我希望能帮助我理解它,这样我就可以编写明智的代码。

在我的应用程序中,我有三个类:

class Person < ActiveRecord::Base
  has_many :selected_apps
  has_many :app_profiles, through: :selected_apps do
    def unselected(reload=false)
      @unselected_app_profiles = nil if reload
      @unselected_app_profiles ||= proxy_association.owner.app_profile_ids.empty? ?
        AppProfile.all :
        AppProfile.where("id NOT IN (?)", proxy_association.owner.app_profile_ids)
    end
  end
end

class AppProfile < ActiveRecord::Base
end

class SelectedApp < ActiveRecord::Base
  belongs_to :person
  belongs_to :app_profile
end

上面的代码让我无需做大量的 SQL 工作就可以完成person.app_profiles.unselected并取回所有AppProfiles当前不相关的内容。Person杰出的!

我的问题是我不理解代码——这总是让我感到不安。我尝试浏览 proxy_association 文档,但它相当不透明。

任何人都可以提供合理直接的解释和/或了解更多信息的好地方吗?

4

1 回答 1

11

基本上,当您self在扩展时调用association它不会返回Association实例,而是委托给to_a.

尝试一下:

class Person < ActiveRecord::Base
  has_many :app_profiles, through: :selected_apps do
    def test_me
      self
    end
  end
end

association有时我们需要在扩展关联本身时到达实际对象。输入proxy_association方法,它将为我们association提供包含owner、、targetreflection属性的方法。

此处参考文档

这个问题提供了一个更简单的proxy_association.owner.

于 2012-05-02T02:07:11.953 回答