假设我有一个模型 Incident 和 Employee 通过关联关联:
事件
belongs_to :recipient, class_name: 'Employee', foreign_key: :recipient_id
belongs_to :responder, class_name: 'Employee', foreign_key: :responder_id
我想在事件模型中有一个范围,它将检索收件人和响应者的姓名。
scope :report, -> {left_joins(:recipient, :responder).select('incidents.*', 'responder.name AS Responder Name', 'recipient.name AS Recipient Name')}
我已经尝试过这样的事情,但我总是遇到“缺少 FROM 子句..”错误。
我需要理解的是:
我如何在选择中引用加入的关联以便我可以区分 响应者和接收者之间是同一张表的记录,但根据不同的外键引用?
最佳答案
加入时需要给表取别名:
SELECT
incidents.*,
recipient.name AS recipient_name,
responder.name AS responder_name
FROM "incidents"
LEFT JOIN
users recipient ON recipient.id = incidents.recipient_id
LEFT JOIN
users responder ON responder.id = incidents.responder_id
您还需要为所选列使用适当的别名 - “收件人姓名”不能很好地映射到 ruby 方法名称。
class Incident < ApplicationRecord
belongs_to :recipient, class_name: 'User'.freeze
belongs_to :responder, class_name: 'User'.freeze
def self.report
self.select('
incidents.*,
recipient.name AS recipient_name,
responder.name AS responder_name
')
.joins("LEFT JOIN users recipient ON recipient.id = incidents.recipient_id")
.joins("LEFT JOIN users responder ON responder.id = incidents.responder_id")
end
end
irb(main):028:0> Incident.report.map(&:attributes)
Incident Load (1.4ms) SELECT incidents.*, recipient.name AS recipient_name, responder.name AS responder_name FROM "incidents" LEFT JOIN users recipient ON recipient.id = incidents.recipient_id LEFT JOIN users responder ON responder.id = incidents.responder_id
=> [{"id"=>1, "recipient_id"=>1, "responder_id"=>2, "created_at"=>Thu, 08 Mar 2018 15:51:52 UTC +00:00, "updated_at"=>Thu, 08 Mar 2018 15:51:52 UTC +00:00, "recipient_name"=>"Bob", "responder_name"=>"Erika"}]
关于sql - Rails 如何从指向同一个表的联合关联中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49176614/