Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以获取关联的ActiveRecord::Relation对象_Activerecord_Ruby On Rails 3_Associations_Arel - Fatal编程技术网

是否可以获取关联的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
    对象

  • 我们都知道,Rails 3在使用。每当我们使用查询界面的
    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
    会贬值