【问题标题】:Composing named_scopes that limit on the same field构成对同一字段进行限制的 named_scopes
【发布时间】:2013-11-13 21:45:11
【问题描述】:

在 Rails 2.3 中,我有以下模型:

class Foo
  named_scope :first_scope, lambda {
    record_ids = SomeModel.find(some_conditions).map(&:foreign_ids)

    { :conditions => {:field => record_ids} }
  }

  named_scope :second_scope, lambda {
    record_ids = SomeOtherModel.find(some_conditions).map(&:foreign_ids)

    { :conditions => {:field => record_ids } }
  }
end

我希望能够调用类似:

Foo.first_scope.second_scope.all

并让它执行看起来像这样的 SQL 语句

SELECT *
FROM foo
WHERE
  field in (1, 2, 3) AND
  field in (2, 3, 4)

甚至更好,我希望它做交叉点并执行

SELECT *
FROM foo
WHERE
  field in (2, 3)

相反,实际执行的是链中最后一个作用域的 SQL。在我的例子中,它是

SELECT *
FROM foo
WHERE
  field in (2, 3, 4)

第一个范围根本就没有应用。我相信这是因为第二个作用域中的条件覆盖了第一个作用域中的条件。

我不能只使用:include:join,因为Foo 由一个数据库支持,而SomeModelSomeOtherModel 由另一个数据库支持,因此不可能进行连接。出于性能考虑,我还想使用named_scopes(而不是执行一个查询然后有选择地删除或类似的东西)。

【问题讨论】:

  • 您是否尝试过为:conditions 使用数组而不是哈希?
  • 刚刚尝试过,虽然它执行了非首选版本的查询,但它确实有效。感谢您的帮助!编辑:如果您作为答案发布并且我没有找到/获得执行首选查询的解决方案,我会接受您的答案。

标签: ruby-on-rails ruby ruby-on-rails-2 named-scope


【解决方案1】:

我已经很久没有做过 Rails2 了,但我猜 ActiveRecord 里面的东西正在合并你的哈希条件,所以它最终会做这样的事情:

h1 = {:field => [1,2,3]}
h2 = {:field => [2,3,4]}
conditions = h1.merge(h2)

结果是第一个:field 条目被第二个覆盖。如果你使用数组条件而不是哈希:

{ :conditions => [ 'field in (?)', record_ids ] }

那么我认为条件会按照您期望的方式叠加。正如我所说,我的 Rails2 生锈了,所以我可能没有正确的数组条件语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    相关资源
    最近更新 更多