Rails 4 - 多态关联之间的复杂查询

时间:2016-01-05 11:38:13

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

我有一个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名对象?

  • 如何通过单位资金获得前五名对象?

1 个答案:

答案 0 :(得分:0)

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

  1. 按销售单位排名前5位的对象? ANS:

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

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

    1. 前五名对象,以单位资金引入

      SELECT *,SUM(金额*价格)AS money_brought_in FROM TRANSACTIONS GROUP BY transactions.sellable_id,transactions.sellable_type 通过money_brought_in desc订购 限制5;

    2. 您可以执行原始查询或使用您认为合适的arel,然后可以获取相应的对象。

      只是一个粗略的想法。我希望它有所帮助