2015-04-02 38 views
1
versions = Version.where({ 
    item_type: 'Product', 
    event: 'update', 
    item_id: account.products.pluck(:id) 
    }) 

我目前的解決方案顯示版本變化是查詢其中的item_id是一個id數組的papertrail版本。Rails加入多態模型

查詢最終看起來像這樣...和成長的日常

Version Load (258.6ms) SELECT "versions".* FROM "versions" 
WHERE "versions"."item_type" = $1 AND "versions"."event" = $2 AND 
"versions"."item_id" IN (8526, 8527, 8528, 8529, 35735, 35736, 
35904, 42293, 43000, 46408, 46409, 46410, 46411, 46412, 46413, 
46414, 46415, 46416, 46417, 46418, 46419, 46420, 46421, 46422, 
46423, 46424, 46425, 46426, 46427, 46428, 46429, 46430, 46431, 
46432, 46433, 46434, 46435, 46436, 46437, 4643, .... 
.... 
.... 

有沒有更好的方式來做到這一點?

喜歡的東西Version.join('versions.item_id on account.products.ids')

回答

0

猜像

Version.joins('join products on products.id=versions.item_id joins accounts on accounts.id=products.account_id').where(accounts: {id: account.id}, versions: {event: 'update'}) 

可能做的伎倆。但不知道這種方式是否對大型數據庫更有效。 Papertrail在item_type,item_id字段上創建複合索引,並在您的選擇中使用該索引。在某些情況下加入可能會變慢。

+0

嗯...看來隨着我的產品陣列的增長(有可能是成千上萬),有一種更有效的方式,就是將一大串ID與其匹配......我真的不知道¯\ _(ツ)_ /¯ – 2015-04-02 22:09:09