versions = Version.where({
    item_type: 'Product',
    event: 'update',
    item_id: account.products.pluck(:id)
  })

我当前显示版本更改的解决方案是查询papertrail版本,其中item_id是一个id数组。
查询结果是这样的。。。每天都在成长
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')

最佳答案

猜猜看

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字段上创建复合索引,并在您的选择中使用该索引。在某些情况下加入可能会比较慢。

关于ruby-on-rails - Rails加入多态模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29418979/

10-14 14:08