Инкапсуляция SQL в named_scope

9
задан sutee 26 September 2008 в 03:39
поделиться

3 ответа

В то время как можно поместить любой 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 однако, Вы просто даете направляющим большую строку. Это не знает то, что идет, где, таким образом, для него не безопасно войти и добавить вещи, это должно было бы добавить для объемов для работы.

10
ответ дан 4 December 2019 в 20:26
поделиться

уверенный, почему нет

:named_scope: условия => [Ваш sql]

0
ответ дан 4 December 2019 в 20:26
поделиться

Это не совсем то, о чем вы спрашивали, но вы можете исследовать 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'"
}
1
ответ дан 4 December 2019 в 20:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: