我想知道是否有办法在 named_scope 中使用“find_by_sql”。我想将自定义 sql 视为 named_scope,以便我可以将其链接到我现有的 named_scopes。这对于优化我经常使用的 sql 片段也很有用。
thaiyoshi
问问题
5826 次
3 回答
10
虽然您可以将任何您喜欢的 SQL 放在命名范围的条件中,但如果您随后调用,find_by_sql
那么“范围”将被丢弃。
鉴于:
class Item
# Anything you can put in an sql WHERE you can put here
named_scope :mine, :conditions=>'user_id = 12345 and IS_A_NINJA() = 1'
end
这行得通(它只是将 SQL 字符串粘贴在那里 - 如果你有多个它们与 AND 连接)
Item.mine.find :all
=> SELECT * FROM items WHERE ('user_id' = 887 and IS_A_NINJA() = 1)
然而,这并不
Items.mine.find_by_sql 'select * from items limit 1'
=> select * from items limit 1
所以答案是“不”。如果您考虑幕后必须发生的事情,那么这很有意义。为了构建 SQL rails 必须知道它是如何组合在一起的。
当您创建普通查询时,select
, joins
,conditions
等都被分解成不同的部分。Rails 知道它可以在不影响其他所有内容的情况下向条件添加内容(这就是工作方式with_scope
和named_scope
工作方式)。
但是,您只需find_by_sql
给 rails 一个大字符串。它不知道什么在哪里,所以它进入并添加它需要添加的东西以使范围工作是不安全的。
于 2008-10-07T21:09:35.627 回答
1
这并不能完全解决您所问的问题,但您可能会调查“construct_finder_sql”。它使您可以获取命名范围的 SQL。
named_scope :mine, :conditions=>'user_id = 12345 and IS_A_NINJA() = 1'
named_scope :additional {
:condtions => mine.send(:construct_finder_sql,{}) + " additional = 'foo'"
}
于 2009-05-29T17:15:28.357 回答
0
确定为什么不
:named_scope :conditions => [你的 sql ]
于 2008-09-26T03:43:11.513 回答