是否可以获取关联的ActiveRecord::Relation对象
诸如是否可以获取关联的ActiveRecord::Relation对象,activerecord,ruby-on-rails-3,associations,arel,Activerecord,Ruby On Rails 3,Associations,Arel,诸如定义的关联方法是否有许多和所属的利用了ActiveRecord::Relation 如果是,是否可以获取正在使用的ActiveRecord::Relation对象 我们都知道,Rails 3在使用。每当我们使用查询界面的select,joins等方法时,都会返回一个ActiveRecord::Relation对象。然而,当调用模型的关联方法时,情况似乎并非如此。相反,将立即执行查询,并返回关联模型的实例或实例数组 u.posts.where("").class # => Active
定义的关联方法是否有许多
和所属的
利用了ActiveRecord::Relation
ActiveRecord::Relation
对象select
,joins
等方法时,都会返回一个ActiveRecord::Relation
对象。然而,当调用模型的关联方法时,情况似乎并非如此。相反,将立即执行查询,并返回关联模型的实例或实例数组
u.posts.where("").class # => ActiveRecord::Relation
u.posts.where("").to_sql # => SELECT `posts`.* FROM `posts` WHERE `posts`.user_id = 1
考虑以下模型:
post.rb
class Post < ActiveRecord::Base
belongs_to :user
end
class user < ActiveRecord::Base
has_many :posts
end
例如:
u = User.first
u.posts
调用u.posts
返回一个posts数组,而不是ActiveRecord::Relation
的实例。我想知道是否有可能获得协会正在使用的ActiveRecord::Relation
,如果它正在使用,也许可以使用Arel::Table
我想要使用
ActiveRecord::Relation
的理由应该很明显:这是因为我想将现有关联链接起来,并操纵查询以满足不同的目的。通过花时间实际阅读Edge Guides文档,我能够在中找到答案。简而言之,文档没有说明是否可以获取ActiveRecord::Relation
对象,或者是否正在使用ActiveRecord::Relation
对象,但是它提供了如何重用关联和定制其结果的详细信息
部分列出了集合
。其中
作为添加的方法之一,具有许多关联。第节展示了如何使用它,就像使用查询界面的where
方法一样。更重要的是,它给出了一个提示,当在集合上使用此方法时,对象是延迟加载的,并且确实返回了一个ActiveRecord::Relation
对象
u.posts.where("").class # => ActiveRecord::Relation
u.posts.where("").to_sql # => SELECT `posts`.* FROM `posts` WHERE `posts`.user_id = 1
诚然,这不是一个理想的解决方案,但它确实给了我一些可以链接的东西。几分钟后,我使用了where(nil)
hack,然后我灵机一动,尝试了一些随机的东西:
User.first.posts.scoped
就这样D
是的,Rails+Arel的文档记录非常糟糕。期待它成熟到我可以实际查找并得到实际答案的程度。在Rails 4中,使用.scope
或.spawn
访问关系对象,而不是CollectionProxy
。请参阅ActiveSupport::Concern
中的。,您不能调用私有方法spawn
或使用作用域
或作用域
我需要用这个
where(true)
我喜欢。干净多了!我给你打勾。我同意Arel的文件。我到处都在读有关这件事的零星报道。它似乎非常强大,但如果没有良好的文档,它也可能非常烦人。:)有没有办法在我制作的自定义数组上调用.scoped
(答案是否定的:scoped
只在顶级类上才有意义:/)有趣的是,scoped甚至可以用于has_和_belien_to_many,否则会返回一个数组。.scoped
会贬值