1

我有一个Event与模型many-to-many关联的Service模型

用户可以创建事件并选择将哪些服务标记到该事件。

用户可以订阅服务,当创建事件时,如果用户订阅了在该事件中标记的服务,则应通知用户。

此外,模型与User模型有has_many关联Email

我希望能够获得所有电子邮件地址的数组,以便向订阅者发送通知。

这是我所拥有的:

class Event < ActiveRecord::Base

  has_many :event_services, :dependent => :destroy
  has_many :services, :through => :event_services

  def recipients
    recipients = services.each_with_object(arr = []) do |service|
      service.users.each do |user|
        user.emails.each do |email|
          arr << email.address
        end
      end
    end
  end
  recipients.uniq
end

这行得通,但它超级丑陋而且效率不高。我将如何优化这个?

这是我的电子邮件模型:

class Email < ActiveRecord::Base
  attr_accessible :address, :user_id  
  belongs_to :user
end
4

1 回答 1

3

使用单个 SQL 请求会更有效以下使用多个连接的请求应该可以工作:

def recipients
  Email.joins(:user => {:services => :event_services}).where(:event_services => {:event_id => self.id}).pluck(:address).uniq
end
于 2013-03-08T16:52:52.750 回答