【问题标题】:Rails 4 - Complicated query between polymorphic associationsRails 4 - 多态关联之间的复杂查询
【发布时间】:2016-01-05 11:38:13
【问题描述】:

我有一个Transaction 模型,它与ProductService 都具有多态关联。

这是迁移:

create_table :products do |t|
    t.string :name

    t.timestamps null: false
end

create_table :services do |t|
    t.string :name
    t.integer :duration

    t.timestamps null: false
end

create_table :transactions do |t|
    t.integer :amount
    t.decimal :price
    t.references :sellable, polymorphic: true, index: true
    t.references :bill, index: true, foreign_key: true

    t.timestamps null: false
end

这是模型

class Transaction < ActiveRecord::Base
    belongs_to :bill
    belongs_to :sellable, polymorphic: true

    def total; price * amount; end
end

class Product < ActiveRecord::Base
    has_many :transactions, as: :sellable
end

class Service < ActiveRecord::Base
    has_many :transactions, as: :sellable
end

基本上每笔交易都知道售出了哪些商品、多少件商品以及每件商品的价格。

  • 如何获得销量前 5 位的物品?

  • 如何获得前 5 名的物品,按收入单位计算?

【问题讨论】:

    标签: ruby-on-rails associations polymorphic-associations


    【解决方案1】:

    似乎是自定义查询/arel_table 的用例

    1. 按销量排名前 5 位的物品? 答:

      SELECT *, SUM(amount) AS units FROM TRANSACTIONS GROUP BY transactions.sellable_id, transactions.sellable_type ORDER BY units desc LIMIT 5;

    请注意,它在 MySQL 中可以正常工作,但在 Postgres 等其他数据库中可能无法正常工作。您需要限制 SELECT 子句中的列以使其与它们一起使用

    1. 前 5 个对象,按收入单位计算

      SELECT *, SUM(amount * price) AS money_brought_in FROM TRANSACTIONS GROUP BY transactions.sellable_id, transactions.sellable_type ORDER BY money_brought_in desc 限制 5;

    您可以执行原始查询或使用任何您觉得舒服的 arel,然后可以获取相应的对象。

    只是一个粗略的想法。希望对你有帮助

    【讨论】:

    • 这与计算行数无关。一笔交易可以卖出超过 1 个单位
    • 那么你不应该在事务表中的列中指出这一点吗?对不起,如果我没有得到你的数据库结构。你能解释一下你将如何计算单位吗?
    • 那么第一个查询可以修改为:SELECT *, SUM(amount) AS units FROM TRANSACTIONS GROUP BY transactions.sellable_id, transactions.sellable_type ORDER BY units desc LIMIT 5;请注意,它在 MySQL 中可以正常工作,但在 Postgres 等其他数据库中可能无法正常工作。您需要限制 SELECT 子句中的列以使其与它们一起使用。希望对你有帮助
    • 因为当 GROUP BY 存在于 Postgresql 中时,SELECT 列表表达式引用未分组的列是无效的,除非在聚合函数中,因为对于未分组的返回值可能不止一个列。
    • 您能否添加一个在 Postgresql 中如何工作的示例?
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多