ruby-on-rails – CollectionProxy vs AssociationRelation

我想知道ActiveRecord :: Associations :: CollectionProxy和ActiveRecord :: AssociationRelation之间的区别.
class Vehicle < ActiveRecord::Base
  has_many :wheels
end

class Wheel < ActiveRecord::Base
  belongs_to :vehicle
end

所以,如果我这样做:

v = Vehicle.new

v.wheels#=> #< ActiveRecord :: Associations :: CollectionProxy []>

v.wheels.all#=> #< ActiveRecord :: AssociationRelation []>

我不知道它们之间有什么区别以及为什么这样实现?

解决方法

ActiveRecord :: Relation是简单的查询对象,在变成查询并执行之前,另一方面,CollectionProxy稍微复杂一些.

首先,你得到了关联扩展,你可能看到了这样的东西,假设一个有很多书的书店模型

class Store < ActiveRecord::Base
  has_many :books do
    def used
      where(is_used: true)
    end
  end
end

这样,您就可以使用类似这样的语法在商店中调用旧书

Store.first.books.used

但这是最基本的用途,您可以使用在集合代理中公开的属性,即属性,反射和目标

所有者

所有者提供对持有关联的父对象的引用

反射

反射对象是ActiveRecord :: Reflection :: AssocciationReflection的实例,包含关联的所有配置选项.

目标

目标是关联集合对象(或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

您还可以访问另外两个重置和重新加载的方法,第一个(重置)清除缓存的关联对象,第二个(重新加载)更常见,用于重置然后从数据库加载关联的对象.

我希望这能解释如何使CollectionProxy类如此有用

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...