Как я могу использовать Rails метод "find" для выполнения запросов AND или OR? - PullRequest
5 голосов
/ 13 ноября 2008

Давайте предположим, что у меня есть модель под названием «продукт». Давайте предположим, что продукт имеет три поля. Этими полями являются «имя» (строка типа), «стоимость» (тип целое число) и «is_visible» (тип bool).

1) Как я могу выполнить поисковый запрос, используя метод "найти" в Rails (если есть другой метод, это нормально), чтобы я мог искать все товары со стоимостью более 100, а is_visible - это правда? *

2) Что если мы захотим изменить это на поиск, где имя! = '' ИЛИ ​​стоимость == 0?

Это не проблема для создания SQL, но я хотел бы думать, что в Rails есть способ выполнять запросы И / ИЛИ к базе данных без использования SQL.

Спасибо!

Ответы [ 3 ]

13 голосов
/ 13 ноября 2008

Вам нужно будет использовать опцию условий в методе поиска. Опция условий может быть либо Hash, Array, либо String. Существует множество вариантов условий, поэтому я рекомендую прочитать справку API . Например, если вы хотите (1):

Product.find(:all, :conditions => ['cost > ? and is_visible is true', 100])

Или (2)

Product.find(:all, :conditions => ["name != '' or cost =0])
4 голосов
/ 13 ноября 2008

Если вы хотите что-то вроде LINQ, вы можете проверить альтернативные Ruby ORM, такие как DataMapper или Sequel , которые предоставляют более сложные возможности фильтрации.

Например, в Sequel 2 вы можете написать:

items.filter((:cost > 100) & (:is_visible = 1))

Вы также можете использовать побитовое «|» оператор для получения условия ИЛИ.

В DataMapper это будет выглядеть так:

Model.all(:cost.gt => 100, :is_visible.eq => 1)

Однако некоторым людям не нравится тот факт, что эти функции реализованы путем перегрузки стандартного класса Symbol.

0 голосов
/ 13 ноября 2008

Это именно та проблема, для решения которой был разработан SQL, так почему бы не использовать ее? Просто добавьте соответствующее условие: и ваша проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...