Ruby on rails 3 Rails 3,无法访问Arel::SelectManager
我的用户模型带有Ruby on rails 3 Rails 3,无法访问Arel::SelectManager,ruby-on-rails-3,activerecord,scope,rails-activerecord,arel,Ruby On Rails 3,Activerecord,Scope,Rails Activerecord,Arel,我的用户模型带有:除了\u id范围: scope :except_ids, ->(*ids) { where { id.not_in ids } } 问题是-我不能将它用于另一个懒惰的查询。例如,如果我这样称呼: User.except_ids(User.except_ids(1,2)) 我最终得到了 TypeError: Cannot visit Arel::SelectManager 我的项目中有更复杂的查询,但除了范围之外,一切都很好。 我可以通过用实际代码替换作用域来实现它
:除了\u id
范围:
scope :except_ids, ->(*ids) { where { id.not_in ids } }
问题是-我不能将它用于另一个懒惰的查询。例如,如果我这样称呼:
User.except_ids(User.except_ids(1,2))
我最终得到了
TypeError: Cannot visit Arel::SelectManager
我的项目中有更复杂的查询,但除了范围之外,一切都很好。
我可以通过用实际代码替换作用域来实现它,但这很难闻
那么,有没有办法找到答案呢?如果您想通过一个SQL查询来实现这一点,它必须包含一个,Arel不直接支持它,但您可以使用 您看到的错误可能是由以下事实引起的:
用户。除了id(1,2)
返回ActiveRecord::Relation
的实例,这可能是lambda签名中的splat运算符的问题。这是可行的,但会导致两个查询:
User.except_ids(User.except_ids(1,2).map(&:id))
问题是,map(&:id)将为括号内的关系加载结果。我所有操作的要点都是生成一个巨大的查询。为了提高双查询解决方案的效率,请使用pull而不是map:
User.except\id(User.except\id(1,2).pull('id'))
。这将生成一个SELECT id
而不是SELECT*
,并以仅包含id的数组形式返回它。