Использование метода .where в Rails3
Я только начал использовать метод .where, и я немного смущен тем, как его полностью использовать.
Я хотел бы сделать что-то вроде:
@books = Book.where(:author_id => 1 || 2)
Я знаю, что это не работает, но я пытаюсь продемонстрировать, что мне нужна дополнительная логика. некоторые "или" "и" "не равны" и т.д.
Любые идеи, где я могу это исследовать? Я смотрел в API-интерфейсах rails, но я не видел ничего полезного.
Спасибо!
Ответы
Ответ 1
1 || 2
не будет работать, потому что это выражение оценивается перед вызовом функции (он оценивается в 1, поэтому он должен быть эквивалентен Book.where(:author_id => 1)
. Я бы сделал:
@books = Book.where(:author_id => [1, 2])
Сгенерированный SQL будет WHERE author_id IN (1, 2)
.
Ответ 2
Посмотрите на MetaWhere, https://github.com/ernie/meta_where - это позволяет сделать это довольно аккуратно:)
Ответ 3
Глядя на источник (нет приличной документации!), вы можете пройти через SQL, который может быть параметризован как sql для: условий и т.д., поэтому вы можете сделать что-то вроде:
@books = Book.where("author_id = 1 OR author_id = 2")
Не стоит отказываться от необработанного SQL, но я не вижу более элегантного способа сделать это, используя метод where.
Источник и отсутствие документации здесь
Ответ 4
Похоже, вы можете взглянуть на Ареля на более сложные вещи. Он уже встроен в 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')
Также группируются, агрегируются и многое другое. Недостатком является то, что документация разрежена.
docs
тесты