我有以下活动记录模型:
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消息的作业。这甚至有可能吗?
答案 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
从您的问题中不清楚您是否正确设置了所有这些关联。