【问题标题】:Rails 3, Cannot visit Arel::SelectManagerRails 3,无法访问 Arel::SelectManager
【发布时间】:2013-03-05 09:06:38
【问题描述】:

我有:except_ids范围的用户模型:

scope :except_ids, ->(*ids) { where { id.not_in ids } }

问题是 - 我不能将它与其他惰性查询一起使用。例如,如果我这样称呼:

User.except_ids(User.except_ids(1,2))

我结束了

TypeError: Cannot visit Arel::SelectManager

我的项目中有更复杂的查询,但一切正常 - 除了那个范围。 我可以通过用实际代码替换作用域来使其工作,但那有异味。

那么,有什么办法可以查出来吗?

【问题讨论】:

    标签: ruby-on-rails-3 activerecord scope rails-activerecord arel


    【解决方案1】:

    如果你想通过单个 SQL 查询来实现这一点,它必须包含一个 subquery,这不是 Arel 直接支持的,但你可以使用 this workaround,例如。

    您看到的错误可能是因为User.except_ids(1,2) 返回了ActiveRecord::Relation 的实例,这可能是lambda 签名中的splat 运算符的问题。这可行,但会导致 2 个查询:

    User.except_ids(User.except_ids(1,2).map(&:id))
    

    【讨论】:

    • 嗯,问题是,map(&:id) 将加载括号内关系的结果。我所有操作的重点是生成一个巨大的查询。
    • 为了提高双查询解决方案的效率,请使用 pluck 而不是 map:User.except_ids(User.except_ids(1,2).pluck('id'))。这会产生一个SELECT id 而不是SELECT *,并在一个只有ID 的数组中返回它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2011-11-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多