2016-01-05 60 views
1

我有一個Transaction模型,它與ProductService都有多態關聯。Rails 4 - 多態關聯之間的複雜查詢

這是遷移:

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名的對象,單位是否帶入金錢?

回答

0

好像使用情況自定義查詢/ arel_table

  1. 前5個對象,由單位出售? ANS:

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

請注意,它可以在MySQL中正常工作,但可能無法在Postgres等其他數據庫中工作。你需要限制在SELECT子句中的列,使之與他們的工作

由帶入的

單位的錢
  • 前5名對象,

    SELECT *,SUM(數量*價格)AS money_brought_in來自交易 GROUP BY transactions.sellable_id,transactions.sellable_type ORDER BY money_brought_in desc LIMIT 5;

  • 您可以執行原始查詢或使用arel,然後獲取相應的對象。

    只是一個大概的想法。我希望它有幫助

    +0

    它不是關於計數行。一筆交易可能賣出多於一個單位 –

    +0

    那麼您是否也不應該在交易表中指明一列?對不起,如果我沒有得到你的數據庫結構。你能解釋一下你如何計算單位嗎? –

    +0

    交易中的字段「amount」正好表示... –