Problem
I have a Post
and a Comment
and I want to select posts and use a .joins()
and a .where()
on the Comment that contains an OR
and has 2 IN
conditions.
I want something that generates this:
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)
I would use the .or()
method but it cannot take a hash.
Post.joins(Comment)
.where({ comments: { id: [1, 2, 3] } })
.or({ comments: { user_id: [4, 5, 6] } }) # <-- raises exception
Possible Solution
I simplified this for readability. In reality I need this to work across database adapters so I'd use Comment.connection.quote_table_name
and Comment.connection.quote_column_name
to correctly quote the table and column names.
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)
Question
This works but it seems like there should be a better way... is there?