【问题标题】:Filtering on activerecord relation without additional sql query?在没有额外的 sql 查询的情况下过滤 activerecord 关系?
【发布时间】:2013-10-23 18:48:03
【问题描述】:

如何在不执行额外查询的情况下过滤 AR 查询的结果?

例如

u = User.where(name: "bob", age: [10, 20])
# 1st select query to db
u.class # ActiveRecord::Relation
tens = u.where(age: 10)
# 2nd select query to db

我不希望第二个查询调用数据库,而是过滤在 u(第一个查询)中检索到的结果。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord ruby-on-rails-4


    【解决方案1】:

    ActiveRecord:Relation 仅在访问其元素时才查询数据库。因此,除非您编写u.firsttens.first 之类的内容,否则您拥有的序列根本不会调用数据库。

    在 Rails 控制台中有点不同,因为每个语句的结果都会打印到控制台,因此每次都会执行查询。您可以通过在每条语句后附加; 1 来跳过打印。

    除此之外,如果您仍想使用第一个查询过滤结果:

    u = User.where(name: "bob", age: [10, 20]) # no query at this point
    u.class # ActiveRecord::Relation
    u.first # query to db
    u.class # Array
    
    tens = u.select{|x| x.age == 10} # no query to db
    

    【讨论】:

    • 控制台在返回的对象上调用inspect 并将其打印出来。用于ActiveRecord::Relation 的方法inspect 调用to_a api.rubyonrails.org/classes/ActiveRecord/… 加载并返回记录api.rubyonrails.org/classes/ActiveRecord/…,因此已经执行了所需的查询。
    • 另外,我使用; nil 而不是附加; p 1。仅仅; 1 实际上已经足够了。
    • @kristinalim 真实且更好
    • 但是如果你更新数据我不起作用: u = User.where(name: "bob", age: [10, 20]) # 1st select query to db u.each{|你| u.firstname='something'} # only memory tens = u.where(age: 10) && --> 第二次访问 db 而不考虑 las update (firstname='something') --> 不在控制台中测试
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多