2013-04-18 2 views
0

У меня есть следующие модели:Rails 3: Полиморфный кондиционер запрос

class Notification < ActiveRecord::Base 

belongs_to :notificatable, polymorphic: true 

end 

class BounceEmailNotification < ActiveRecord::Bas 

has_one :notification, :as => :notificatable, :dependent => :destroy 

end 

class UserNotifierEmailNotification < ActiveRecord::Base 

has_one :notification, :as => :notificatable, :dependent => :destroy 

end 

Как вы можете видеть, уведомление может быть типа «отскок по электронной почте уведомление» или «пользователь уведомитель уведомления по электронной почте». Модель BounceEmailNotification имеет атрибут строки события. Что делать, если я хочу получить все уведомления об уведомлениях пользователей и все уведомления об отказе электронной почты, имеющие конкретное значение события, упорядоченное по created_at?

Что-то вроде этого (с использованием squeel):

(Notification.joins{ notificatable(BounceEmailNotification) }.where('bounce_email_notifications.event' => 'error') + Notification.joins { notificatable(UserNotifierEmailNotification) }).sort_by { |n| n.created_at } 

будет работать, но я не хочу использовать Ruby, чтобы заказать уведомления. Что я могу сделать? Спасибо

ответ

0

Попробуйте это.

Notification.joins('left outer join bounce_email_notifications on notifications.notificatable_id = bounce_email_notifications.id and notificatable_type = "BounceEmailNotification"'). 
where("bounce_email_notifications.event = ? or notificatable_type = ?",'error',UserNotifierEmailNotification.to_s). 
order('notifications.created_at') 

Это использует активную запись 3.2, но я думаю, он должен работать в рельсах 3.

Я не использовал squeel косяк комментарий многое о том, как использовать его с squeel, но это может дать вам краткое представление ,

В squeel я придумал что-то вроде этого (не тестировались), созданные с помощью squeel docs

Notification.notificatable{notable(BounceEmailNotification).outer}. where{ 
     { ('bounce_email_notifications.event'=>'error') | (:notificatable_type=>UserNotifierEmailNotification.to_s) } 

КОНЦЕПТУАЛЬНЫХ шагов

  1. покинул присоединиться на bounce_email_notifications, чтобы получить все bounce_email_notifications и и не bounce_email_notifications уведомление в результате

  2. проверить, если bounce_email_notification s.event = событие
    или notificatable_type = 'UserNotifierEmailNotification' для всех записей UserNotifierEmailNotification

  3. сортировать записи по notifications.created в

Надеется, что это помогает.

Смежные вопросы