ruby-on-rails - Rails Query 通过直通类将子类与父类结合起来
问题描述
我有以下课程
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 关系解析的行为。
在这种情况下,has_many :order_issues
不带该:through
选项的设置似乎是正确的用法,并且会为您提供您正在寻找的查询,因为OrderIssue
直接belongs_to :order
. OrderDelivery
也应相应更新。
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
推荐阅读
- g++ - 使用 g++ 9.3.0 对 * 的未定义引用
- c# - 使用 GroupBy 从 List 中创建 SubLists,其中 GroupBy 值为 List
- node.js - 两个日期之间的 MongoDB 聚合字段
- statsmodels - stats-models 包中的 Ridge、Lasso 和 Ridge
- commit - pygithub如何获取特定分支的最新提交
- php - 只删除一次重复值,然后对数组求和
- c# - C# Coinbase Pro API 如何解决响应问题。401
- postgresql - 找不到食谱的厨师食谱
- python - 如何将项目从一个窗口中的 QListWidget 传输到另一个窗口中的另一个 QListWidget?
- node.js - 输入和制表符不在 req.body 中