Как мне выполнить поиск OR SQL с помощью Ruby on Rails? - PullRequest
2 голосов
/ 26 апреля 2009

Я только начинаю изучать Ruby on Rails, и мне не удалось найти ответ на этот вопрос.

У меня есть следующий код:

@products = Product.find(:all,
  :conditions => ["productsubtype_id = ?", @productsubtypes],
  :order => "name")

@ productsubtypes - это массив (в настоящее время содержащий два объекта из другого запроса SQL, почти идентичного этому) - генерируемый им SQL следующий:

SELECT * FROM `products` WHERE (productsubtype_id = 2,3)  ORDER BY name

Как видите, вышеприведенное недействительно (по крайней мере, не для MySQL) - мне нужно найти способ изменить исходный код Ruby, чтобы сгенерировать следующий код SQL (или что-то похожее на него:

SELECT * FROM `products` WHERE (productsubtype_id = 2 
  OR productsubtype_id = 3)  ORDER BY name

Есть ли способ изменить исходный код, чтобы он делал то, что мне нужно, или я здесь на неправильном пути?

Спасибо за вашу помощь,

Juan

Ответы [ 4 ]

3 голосов
/ 26 апреля 2009

Оба решения работают, но ActiveRecord уже имеет встроенную поддержку, позволяющую узнать, передаете ли вы массив или один идентификатор при использовании хэша условий. Пример:

User.all(:conditions => {:id => [1,2,3]})

генерирует запрос

SELECT * FROM `users` WHERE (users.`id` IN( 1,2,3 )) 

так что вы бы хотели

@products = Product.find(:all,
  :conditions => {:productsubtype_id => @productsubtypes},
  :order => "name")

для более сложных запросов, однако, вам либо нужно передать sql в условиях, либо использовать плагин (т.е. условия_fu)

1 голос
/ 26 апреля 2009

Также необходимо учитывать использование IN против EXISTS. Если подмножество, которое вы используете в IN, очень велико, лучше использовать EXISTS. По сути, один использует объединение, другой нет.

1 голос
/ 26 апреля 2009

@ products = Product.find (: все,

: условия => ["productsubtype_id IN (?) ", @productsubtypes],

: order => "name")

1 голос
/ 26 апреля 2009

Попробуйте использовать плагин condition_fu .

Product.all(:conditions => { :productsubtype_id.in => @productsubtypes },
:order => "name")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...