通过轨道中的两个中间模型查找记录?

时间:2014-04-28 18:53:46

标签: sql ruby-on-rails ruby postgresql activerecord

我在使用rails中的SQL获取某些模型时遇到了一些麻烦,我想知道是否有人知道这个特定问题的良好解决方案。基本上,这些是我的课程的样子:

class SubscriberList < ActiveRecord::Base
  has_many :subscriptions
end

class Subscription < ActiveRecord::Base
  has_many :messages
  belongs_to :subscription_list
end

class Announcement < ActiveRecord::Base
  has_many :messages
end

class Message < ActiveRecord::Base
  belongs_to :subscription
  belongs_to :announcement
end

现在,我想访问SubscriptionList的所有公告,不包括重复项。这可能吗?可以用一个SQL查询来完成,还是只是一厢情愿的想法?

例如,这就是我想要的:

class SubscriptionList < ActiveRecord::Base
  def announcements
    Announcements.joins(:messages).where(message: { subscription: {subscription_list: self} })
  end
end

1 个答案:

答案 0 :(得分:1)

我认为你的想法一般是正确的。试试这个变种

Announcements.
  joins(messages: {subscription: :subscription_list}).
  where(subscription_lists: {id: self.id})

# opposite
SubscriptionList.
  joins(subscriptions: {messages: :announcement}).
  where(announcements: {id: self.id})

注意:  *这些查询可能会返回重复项 - 因此uniq可以添加到它们中  * self可以省略(我写它是为了表明这是实例的id并避免误解)