Использование метода .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

тесты