在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
(而不是执行一个查询,然后有选择地删除或类似的东西),因为性能方面的考虑。
答案 0 :(得分:1)
我很长一段时间没有做任何Rails2,但我猜想ActiveRecord中的某些内容正在合并你的Hash条件,所以它最终会做这样的事情:
h1 = {:field => [1,2,3]}
h2 = {:field => [2,3,4]}
conditions = h1.merge(h2)
结果是第一个:field
条目被第二个覆盖。如果使用数组条件而不是哈希:
{ :conditions => [ 'field in (?)', record_ids ] }
然后我认为条件会按照你期望的方式叠加。正如我所说,我的Rails2生锈了所以我可能没有正确的数组条件语法。