【发布时间】: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 由一个数据库支持,而SomeModel 和SomeOtherModel 由另一个数据库支持,因此不可能进行连接。出于性能考虑,我还想使用named_scopes(而不是执行一个查询然后有选择地删除或类似的东西)。
【问题讨论】:
-
您是否尝试过为
:conditions使用数组而不是哈希? -
刚刚尝试过,虽然它执行了非首选版本的查询,但它确实有效。感谢您的帮助!编辑:如果您作为答案发布并且我没有找到/获得执行首选查询的解决方案,我会接受您的答案。
标签: ruby-on-rails ruby ruby-on-rails-2 named-scope