Rails 查询,用于通过直通类将子类与父类联接



我有以下类

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 

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

在这种情况下,在没有:through选项的情况下设置has_many :order_issues似乎是正确的用法,并且会得到您正在寻找的查询,因为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

最新更新