Rails:在没有原始 SQL 的连接 table 列上使用 group()
Rails: Using group() on a joined table column without raw SQL
我在对 ActiveRecord::Relation 进行分组时遇到了一个小问题。我试图在不使用原始 SQL.
的情况下通过连接的 table 列对采石场进行分组
目前的代码如下所示:
Sale::Product.joins(stock_product::supplier).group('core_suppliers.id').first
结果:
Sale::Product Load (42989.5ms) SELECT `sale_products`.* FROM `sale_products` INNER JOIN `stock_products` ON `stock_products`.`deleted_at` IS NULL AND `stock_products`.`id` = `sale_products`.`stock_product_id` INNER JOIN `core_suppliers` ON `core_suppliers`.`id` = `stock_products`.`core_supplier_id` GROUP BY core_suppliers.id ORDER BY `sale_products`.`id` ASC LIMIT 1
我尝试使用 merge
:
来解决这个问题
Sale::Product.joins(stock_product: :supplier).merge(::Core::Supplier.group(:id)).first
结果:
Sale::Product Load (32428.4ms) SELECT `sale_products`.* FROM `sale_products` INNER JOIN `stock_products` ON `stock_products`.`deleted_at` IS NULL AND `stock_products`.`id` = `sale_products`.`stock_product_id` INNER JOIN `core_suppliers` ON `core_suppliers`.`id` = `stock_products`.`core_supplier_id` GROUP BY `sale_products`.`core_supplier_id` ORDER BY `sale_products`.`id` ASC LIMIT 1
我不明白为什么 Active::Record 不按合并的 table 的列对我的关联进行分组。特别是因为这种方式适用于 ```order()````。
提前感谢您的帮助
您可以尝试在 Rails 3 中引入的 Arel
库,用于构建 SQL 查询。
只需将代码中的 ::Core::Supplier.group(core_supplier: :id)
替换为 ::Core::Supplier.arel_table[:id]
:
Sale::Product.joins(stock_product::supplier).group(::Core::Supplier.arel_table[:id]).first
更新
如果您不想在查询中直接使用 Arel,您可以像这样在 ApplicationRecord 中隐藏 Arel 实现:
class ApplicationRecord < ActiveRecord::Base
def self.[](attribute)
arel_table[attribute]
end
end
而且您的查询可以这样重写:
Sale::Product.joins(stock_product::supplier).group(::Core::Supplier[:id]).first
我在对 ActiveRecord::Relation 进行分组时遇到了一个小问题。我试图在不使用原始 SQL.
的情况下通过连接的 table 列对采石场进行分组目前的代码如下所示:
Sale::Product.joins(stock_product::supplier).group('core_suppliers.id').first
结果:
Sale::Product Load (42989.5ms) SELECT `sale_products`.* FROM `sale_products` INNER JOIN `stock_products` ON `stock_products`.`deleted_at` IS NULL AND `stock_products`.`id` = `sale_products`.`stock_product_id` INNER JOIN `core_suppliers` ON `core_suppliers`.`id` = `stock_products`.`core_supplier_id` GROUP BY core_suppliers.id ORDER BY `sale_products`.`id` ASC LIMIT 1
我尝试使用 merge
:
Sale::Product.joins(stock_product: :supplier).merge(::Core::Supplier.group(:id)).first
结果:
Sale::Product Load (32428.4ms) SELECT `sale_products`.* FROM `sale_products` INNER JOIN `stock_products` ON `stock_products`.`deleted_at` IS NULL AND `stock_products`.`id` = `sale_products`.`stock_product_id` INNER JOIN `core_suppliers` ON `core_suppliers`.`id` = `stock_products`.`core_supplier_id` GROUP BY `sale_products`.`core_supplier_id` ORDER BY `sale_products`.`id` ASC LIMIT 1
我不明白为什么 Active::Record 不按合并的 table 的列对我的关联进行分组。特别是因为这种方式适用于 ```order()````。
提前感谢您的帮助
您可以尝试在 Rails 3 中引入的 Arel
库,用于构建 SQL 查询。
只需将代码中的 ::Core::Supplier.group(core_supplier: :id)
替换为 ::Core::Supplier.arel_table[:id]
:
Sale::Product.joins(stock_product::supplier).group(::Core::Supplier.arel_table[:id]).first
更新
如果您不想在查询中直接使用 Arel,您可以像这样在 ApplicationRecord 中隐藏 Arel 实现:
class ApplicationRecord < ActiveRecord::Base
def self.[](attribute)
arel_table[attribute]
end
end
而且您的查询可以这样重写:
Sale::Product.joins(stock_product::supplier).group(::Core::Supplier[:id]).first