К сожалению, нет действительно отличного способа использовать синтаксис 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))