Использование метода .where в Rails3 - PullRequest
14 голосов
/ 07 января 2011

Я только начал использовать метод .where, и меня немного смущает, как его полностью использовать.

Я бы хотел сделать что-то вроде:

@books = Book.where(:author_id => 1 || 2)

Я точно знаю, что это не работает, но я пытаюсь продемонстрировать, что мне нужна дополнительная логика. некоторые «или» и «не равно» и т. д.

Есть идеи, где я могу это исследовать? Я искал в API рельсов, но ничего полезного не увидел.

Спасибо!

Ответы [ 4 ]

26 голосов
/ 07 января 2011

1 || 2 не будет работать, потому что это выражение вычисляется перед вызовом функции (оно оценивается как 1, поэтому оно должно быть эквивалентно Book.where(:author_id => 1). Я бы сделал:

@books = Book.where(:author_id => [1, 2])

СгенерированноеSQL будет WHERE author_id IN (1, 2).

4 голосов
/ 07 января 2011

Посмотрите на MetaWhere, https://github.com/ernie/meta_where - это позволяет делать такие вещи довольно аккуратно:)

3 голосов
/ 07 января 2011

Глядя на источник (без приличной документации!), Вы можете пройти через SQL, который можно параметризовать как sql для: условий и т. Д., Так что вы можете сделать что-то вроде:

@books = Book.where("author_id = 1 OR author_id = 2")

Не идеально подходит для перехода на сырой SQL, но я не вижу более элегантного способа сделать это с помощью метода where.

Источник и отсутствие документации здесь

1 голос
/ 05 сентября 2012

Похоже, вы захотите взглянуть на Арела для более сложных вещей.Он уже встроен в Rails 3 (AR использует его внутри).

book = Book.arel_table
# range
Book.where(book[:author_id].gt(0).and(book[:author_id].lt(3))

#or
Book.where(b[:author_id].eq(0).or(t[:author_id].eq(3).order(:first_name))

#joins
book.join(authors).on(book[:author_id].eq(author[:id])).
    where(book[:title].matches 'hokum n stuff')

Также группировка, агрегация и многое другое.Недостаток в том, что документация скудная. документы

тесты

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