加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 用于查找无关联记录的proxy_association的说明

发布时间:2020-12-17 03:53:52 所属栏目:百科 来源:网络整理
导读:我今天遇到了一些魔法,我希望能帮助你理解它,这样我才能编写有用的代码. 在我的应用程序中,我有三个类: class Person ActiveRecord::Base has_many :selected_apps has_many :app_profiles,through: :selected_apps do def unselected(reload=false) @unsel
我今天遇到了一些魔法,我希望能帮助你理解它,这样我才能编写有用的代码.

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

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

上面的代码让我做person.app_profiles.unselected并获取当前没有与Person关联的所有AppProfiles,而无需进行大量的SQL工作.辉煌!

我的问题是我不理解代码 – 这总是让我感到不安.我试图通过proxy_association文档,但它是相当不透明的.

任何人都可以提供一个相当直接的解释和/或一个学习更多的好地方吗?

解决方法

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

试试吧:

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

有时我们需要在扩展关联本身的同时获取实际的关联对象.输入proxy_association method,它将为我们提供包含owner,target,and reflection attributes的关联.

这里参考的是documentation.

This question提供了一个更简单的proxy_association.owner用例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读