Проблема
У меня есть Post
и Comment
, и я хочу выбрать сообщения и использовать .joins()
и .where()
в комментарии, который содержит OR
и имеет 2 IN
условий.
Я хочу что-то, что генерирует это:
SELECT * FROM posts
INNER JOIN comments ON comments.post_id = posts.id
WHERE comments.id IN (1,2,3) OR comments.user_id IN (4,5,6)
Я бы использовал метод .or()
, но он не может занять га sh.
Post.joins(Comment)
.where({ comments: { id: [1, 2, 3] } })
.or({ comments: { user_id: [4, 5, 6] } }) # <-- raises exception
Возможное решение
Я упростил это для удобства чтения. На самом деле это нужно для работы с адаптерами базы данных, поэтому я бы использовал Comment.connection.quote_table_name
и Comment.connection.quote_column_name
для правильного цитирования имен таблиц и столбцов.
ids = [1,2,3]
user_ids = [4,5,6]
clause = ""
clause += Comment.sanitize_sql_for_conditions(["comments.id IN (?)", ids]) if ids.any?
clause += " OR " if ids.any? and user_ids.any?
clause += Comment.sanitize_sql_for_conditions(["comments.user_id IN (?)", user_ids]) if user_ids.any?
Post.joins(Comment).where(clause)
Вопрос
Это работает, но кажется, что должен быть лучший способ ... есть?