ActiveRecord::Relation
在转换为查询并执行之前是简单的查询对象,CollectionProxy
另一方面更复杂一些。
首先你得到关联扩展,你可能看到了像这样的东西,假设一个书店模型有很多书
class Store < ActiveRecord::Base
has_many :books do
def used
where(is_used: true)
end
end
end
通过这种方式,您可以使用如下所示的语法来调用商店中的旧书
Store.first.books.used
但这是最基本的用途,您可以使用在集合代理中向您公开的属性,即owner
,reflection
和target
所有者
owner
提供对持有关联的父对象的引用
反射
该reflection
对象是关联的一个实例ActiveRecord::Reflection::AssocciationReflection
并包含关联的所有配置选项。
目标
target
是关联集合对象(或当has_one
和时的单个对象belongs_to
)。
使用这些方法,您可以在关联扩展中执行一些条件,例如,如果我们有一个博客,我们会将所有已删除帖子的访问权限授予管理员用户(我知道的蹩脚示例)
Class Publisher < ActiveRecord::Base
has_many :posts do
def deleted
if owner.admin?
Post.where(deleted: true)
else
where(deleted: true)
end
end
end
end
您还可以访问另外两个方法reset
和reload
,第一个 ( reset
) 清除缓存的关联对象,第二个 ( reload
) 更常见,用于reset
然后从数据库加载关联对象。
我希望这能解释CollectionProxy
上课是多么有用