Rails 3 ActiveRecord где предложение, где идентификатор установлен или ноль - PullRequest
2 голосов
/ 14 июня 2011

У меня есть ActiveRecord, Аннотация, с двумя столбцами: user_id и post_id, которые могут быть нулевыми. Аннотации с пустыми user_id и post_id являются «глобальными» аннотациями, которые применимы ко всем постам всех пользователей.

Я хотел бы получить все аннотации, связанные с публикацией конкретного пользователя, и все глобальные аннотации. В MySQL команда SQL будет иметь вид

select * from annotations where (user_id = 123 and post_id = 456) or (user_id is null and post_id is null)

В Rails 3, как лучше всего закодировать это как предложение Annotation.where?

1 Ответ

3 голосов
/ 14 июня 2011

К сожалению, нет действительно отличного способа использовать синтаксис OR sql.Два ваших лучших варианта, вероятно, - написать предложение where самостоятельно, используя связанные параметры:

annotations = Annotation.where("(user_id = ? and post_id = ?) OR (user_id is null and post_id is null)").all

Или вы можете погрузиться в Arel и использовать этот синтаксис для его создания (см. Сообщение Asciicast's Arel ).

Предупреждение , все, что в вызове or - psuedocode, не знаю, как сделать 'post_id is null' - возможно, вам придется просто пройти "user_id имеет значение null, а post_id имеет значение null "до or(), но мое лучшее предположение:

annotations = Annotation.arel_table
annotations.where(annotations[:user_id].eq(123).
            and(annotations[:post_id].eq(456)).
            or(annotations[:user_id].eq(nil).and(annotations[:post_id].eq(nil))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...