20
  1. 关联方法,例如由定义has_manybelongs_to利用的方法ActiveRecord::Relation吗?

  2. 如果是这样,是否可以获得ActiveRecord::Relation正在使用的对象。

我们都知道 Rails 3在使用Query InterfaceActiveRecord::Relation创建查询时大量使用对象,并且Arel::Relation在后台使用对象。每当我们使用查询接口的,等方法时,都会返回一个对象。但是,在调用模型的关联方法时,情况似乎并非如此。相反,查询会立即执行,并返回关联模型的一个实例或实例数组。selectjoinsActiveRecord::Relation

考虑以下模型:

post.rb

class Post < ActiveRecord::Base
  belongs_to :user
end

user.rb

class user < ActiveRecord::Base
  has_many :posts
end

例子:

u = User.first
u.posts

调用u.posts返回一个帖子数组,而不是ActiveRecord::Relation. 我想知道是否有可能获得协会正在使用的那个ActiveRecord::Relation,如果它正在被使用,也许是通过使用?Arel::Table

我想要的理由ActiveRecord::Relation应该很明显:这是因为我想链接现有的关联并操纵查询以适应不同的目的。

4

4 回答 4

34

几分钟后,我使用了where(nil)hack,然后我有了一个脑电波并随机尝试了一些东西:

User.first.posts.scoped

而已!:D

是的,Rails + Arel 的文档记录真的很差。期待它成熟到我可以实际查找并获得实际答案的程度。

于 2010-11-18T18:39:13.820 回答
3

在 Rails 4 中,使用.scopeor.spawn来访问关系对象而不是CollectionProxy. 请参阅文档

于 2014-05-18T10:41:02.113 回答
1

通过花时间实际阅读 Edge Guides 文档,我能够在Section 4.3 Association Reference中找到答案。简而言之,文档没有说明是否可以获取对象或是否正在使用对象,但它确实提供了有关如何重用关联和调整其结果的详细信息。has_manyActiveRecord::RelationActiveRecord::Relation

4.3.1 节添加的方法has_many列出了作为关联添加的方法之一。并且第4.3.1.11节显示您将像使用查询接口的方法一样使用它。更重要的是,它提示了在集合上使用该方法时对象是延迟加载的,果然返回了一个对象。collection.wherehas_manycollection.where(…)whereActiveRecord::Relation

u.posts.where("").class  # => ActiveRecord::Relation
u.posts.where("").to_sql # => SELECT `posts`.* FROM `posts` WHERE `posts`.user_id = 1 

诚然,这不是理想的解决方案,但它确实给了我一些我可以摆脱的东西。

于 2010-11-14T19:31:17.797 回答
1

在 anActiveSupport::Concern中,您不能调用私有方法spawn或使用scopeor scoped

我需要使用这个。

where(true)
于 2016-01-29T20:16:53.063 回答