Каков наилучший способ написать «(x AND y) ИЛИ (a AND b)», где запрос в Rails?Каков наилучший способ написать «(x AND y) ИЛИ (a AND b)», где запрос в Rails?
Я только что написал следующий метод сообщений, чтобы возвращать сообщения между двумя пользователями. Выбор заключается в получении сообщений между двумя пользователями, то есть дайте мне сообщения от меня им и их мне.
Это работает, но выглядит ужасно. Есть ли более простой/лучший способ написать это?
class Conversation
def initialize(me, them)
@me = me
@them = them
end
def messages
t = Message.arel_table
results = Message.where(
(t[:sender_id].eq(@me.id).and(t[:recipient_id].eq(@them.id))).or(
t[:sender_id].eq(@them.id).and(t[:recipient_id].eq(@me.id)))
)
end
end
ПРИМЕЧАНИЕ Благодаря Джимми, я закончил с:
class Conversation
def initialize(me, them)
@me = me
@them = them
end
def messages
me_to_them = "sender_id = :my_id AND recipient_id = :their_id"
them_to_me = "sender_id = :their_id AND recipient_id = :my_id"
Message.where(
"#{me_to_them} OR #{them_to_me}",
{:my_id => @me.id, :their_id => @them.id}
)
end
end
Спасибо! Я не понимал, что могу просто использовать ИЛИ. Кроме того, поскольку AND берет на себя приоритет над OR в SQL, я могу отбросить некоторые скобки и в итоге получил следующее, что, по моему мнению, намного читаемо. 'me_to_them =" sender_id = #{@me.id} И recipient_id = # {@ them.id} "' 'them_to_me =" sender_id = #{@them.id} И recipient_id = #{@me.id } "' 'Message.where (" # {me_to_them} ИЛИ # {them_to_me} "). Order (" created_at DESC ")' – Mike
Это немного опасно, поскольку строковая интерполяция не защищает от SQL-инъекции. Вместо этого вы должны использовать методы массива или хэша. Взгляните на Руководство по интерфейсу запросов ActiveRecord: http://guides.rubyonrails.org/active_record_querying.html –
Отмечено и обновлено выше. Лучше? :) – Mike