Хотя вы можете поместить любой 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, нужно знать, как они сочетаются друг с другом.
Когда вы создаете нормальные запросы, все select
, joins
, conditions
и т. Д. Разбиваются на отдельные части. Rails знает, что он может добавлять вещи в условия, не влияя на все остальное (как работают with_scope
и named_scope
).
Однако с find_by_sql
вы просто даете рельсам большую строку. Он не знает, что и куда, поэтому небезопасно входить и добавлять то, что нужно будет добавить для работы областей.