Есть ли способ объединить их в один запрос ActiveRecord? - PullRequest
1 голос
/ 02 сентября 2011

Мне интересно, есть ли возможность объединить эти два запроса без , используя строку в вызове where ...?

Notification.where(:notifiable_type => "Post", :notifiable_id => post.id)
Notification.where(:notifiable_type => "Comment", :notifiable_id => post.comments.map(&:id))

Другими словами, я ищу способ сделать это, не делая:

Notification.where("(notifiable_type = 'Post' AND notifiable_id = ?) OR (notifiable_type = 'Comment' AND notifiable_id in (?))", [post.id, post.comments.map(&:id)])

Возможно ли это?

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Вы можете использовать MetaWhere , чтобы достичь того, что вы ищете, чистым и читабельным способом:

Notification.where(
  (:notifiable_type => "Post" & :notifiable_id => post.id)
  |
  (:notifiable_type => "Comment" & :notifiable_id => [post.comments.map(&:id))
)
0 голосов
/ 02 сентября 2011

Я уверен, что это можно почистить / реорганизовать, но что-то подобное может сработать.

class Notification

  scope :on_post_or_its_comments, lambda {|post|
    on_post        = arel_table[:notifiable_type].eq('Post').
                       and(arel_table[:notifiable_id].eq(post.id))
    posts_comments = arel_table[:notifiable_type].eq('Comment').
                       and(arel_table[:notifiable_id].in(post.comments.map(&:id))

    where on_post.or(posts_comments)
  }
end

Проблема в том, что (последний раз я проверял) нет способа объединить условия OR в реализацию ActiveRecord для Arel.Более того, вы не можете | области (но вы можете & их).

Есть написанные пользователями гемы, которые позволят вам писать более выразительные запросы ActiveRecord. Metawhere - первое, что приходит на ум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...