В то время как можно поместить любой 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 там - если у Вас есть больше чем один, с ними присоединяются И),
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, должен знать, как это совмещается.
Когда Вы создаете нормальные запросы, select
, joins
, conditions
, и т.д. все разбиты в отличные части. Направляющие знают, что это может добавить вещи к условиям, не влияя на все остальное (который является как with_scope
и named_scope
работа).
С find_by_sql
однако, Вы просто даете направляющим большую строку. Это не знает то, что идет, где, таким образом, для него не безопасно войти и добавить вещи, это должно было бы добавить для объемов для работы.
уверенный, почему нет
:named_scope: условия => [Ваш sql]
Это не совсем то, о чем вы спрашивали, но вы можете исследовать contruct_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'"
}