【问题标题】:Rails Query to join Child class with Parent class via a through classRails Query 通过直通类将子类与父类结合起来
【发布时间】:2020-01-15 17:20:00
【问题描述】:

我有以下课程

class Order
   has_many :order_issues, through: :order_deliveries, inverse_of: :order
end

class OrderDelivery
   has_many :order_issues, as: :issuable, inverse_of: :order_delivery
   belongs_to :order, inverse_of: :order_deliveries
end

class OrderIssue
   belongs_to :order, inverse_of: :order_issues
   belongs_to :order_delivery, inverse_of: :order_issues
end

当我尝试时

Order.joins(:order_issues).to_sql 


SELECT orders.* 
FROM orders 
INNER JOIN order_deliveries 
   ON order_deliveries.order_id = orders.id 
INNER JOIN order_issues 
   ON order_issues.issuable_id = order_deliveries.id 
      AND order_issues.issuable_type = 'OrderDelivery' 

它按预期工作。但是,当我尝试

OrderIssue.joins(:order).to_sql

SELECT order_issues.id 
FROM order_issues 
INNER JOIN orders 
    ON orders.id = order_issues.order_id

为什么不一样?理想情况下,我希望 SQL 查询如下所示,以提供OrderIssue 活动记录

SELECT order_issues.* 
FROM order_issues 
INNER JOIN order_deliveries ON order_issues.issuable_id = order_deliveries.id 
       AND order_issues.issuable_type = 'OrderDelivery'
INNER JOIN orders 
    ON order_deliveries.order_id = orders.id 

【问题讨论】:

  • 多读几遍,看看你是否能找到不同之处:Order.join(:order_issues)OrderIssue.joins(:order)
  • 更新代码

标签: ruby-on-rails activerecord rails-activerecord has-and-belongs-to-many


【解决方案1】:

inverse_of仅用于避免重复检索相同记录;它不会改变 ActiveRecord 关系解析的行为。

在这种情况下,设置 has_many :order_issues 而不使用 :through 选项似乎是正确的用法,并且会得到您正在寻找的查询,因为 OrderIssue 直接 belongs_to :orderOrderDelivery 也应相应更新。

class Order
  has_many :order_issues
  has_many :order_deliveries
end

class OrderDelivery
  belongs_to :order
  has_many :order_issues, through: :order
end

class OrderIssue
  belongs_to :order
  has_many :order_deliveries, through: :order
end

【讨论】:

  • orders 没有order_issues 直接。他们通过order_deliveries 作为issuable。我已经更新了代码,以防之前混淆。
  • @Sathish 那么OrderIssue 应该是belong_to :order_delivery,而不是:order,也可以是has_one :order, through: :order_delivery
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
相关资源
最近更新 更多