Rails 3:多态条件查询

时间:2013-04-18 23:34:49

标签: ruby-on-rails-3 squeel

我有以下型号:

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排序,该怎么办?

像这样(使用吱吱声):

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

会起作用,但我不想使用Ruby来订购通知。我能做什么?感谢

1 个答案:

答案 0 :(得分: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但我想它应该在rails 3中工作。

我没有使用squeel cant评论如何使用它与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_notifications.event = event
    要么 所有UserNotifierEmailNotification记录的notificatable_type ='UserNotifierEmailNotification'

  3. 通过notification.created at

  4. 对记录进行排序

    希望这有帮助。