Rails通过另一个关联嵌套查询

时间:2018-07-23 20:40:49

标签: ruby-on-rails ruby

我有以下活动记录模型:

class Jobs
  has_many :leads
end

class Lead
  has_many :messages, through :notification
end

class Notification
  has_many :messages
end

class Message
  # has a type column (varchar) containing either: email, sms
end

我不确定如何找到所有通过其关联包含非sms消息的作业。这甚至有可能吗?

2 个答案:

答案 0 :(得分:3)

您可以联接表并设置where子句,以过滤不是sms的消息。

可能是这样的:

Jobs.joins(leads: [{ notifications: :messages }]).where("type <> 'sms'")

检查https://guides.rubyonrails.org/active_record_querying.html#joining-tables以获得更多信息。

答案 1 :(得分:1)

正如Bruno和Jedi指出的那样,这样的方法可能有效:

Job.joins(leads: [{ notifications: :message }]).where.not(messages: {msg_type: 'sms'})

请注意,这为Job(而不是Jobs)使用单数名称。关联如下:

class Job < ApplicationRecord
  has_many :leads
end

class Lead < ApplicationRecord
  belongs_to :job
  has_many :notifications
  has_many :messages, through: :notifications
end

class Notification < ApplicationRecord
  belongs_to :lead
  belongs_to :message
end

class Message < ApplicationRecord
  has_many :notifications
  has_many :leads, through: :notifications
end

从您的问题中不清楚您是否正确设置了所有这些关联。