sql - Rails 如何从指向同一个表的联合关联中进行选择

标签 sql ruby-on-rails ruby join activerecord

假设我有一个模型 IncidentEmployee 通过关联关联:

事件

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/

相关文章:

sql - PostgreSQL 和用于分析频繁大型插入的性能成本的工具

mysql - 如何从列值匹配的表中查找特定的列名?

sql - 使用 SQL 获取每小时统计信息

ruby-on-rails - 每个帐户创建不同的数据库

ruby-on-rails - 打印 Prawn 生成的pdf

Ruby PCAP 读取完整的捕获文件

ruby-on-rails - 错误的参数数量(4 个为 5 个)Rails 4.1.14.1

sql - 寻找更好的方法来获得每组前 1 名

javascript - jQuery:如何记住多步 Rails 3 表单中的选择?

ruby - Ruby 循环 | Selenium |网络测试