mysql - 轨道 4 : model relationships and indexing for two has_many through models

标签 mysql ruby-on-rails-4 activerecord indexing arel

我的场景如下

公司 has_many 作为多态关系进行采购

用户 has_many 购买作为多态关系

注:用户和公司之间没有关系

购买属于多态性

购买 has_many 件商品

用户通过购买拥有_许多件商品

代码方面

class User
  has_many :purchases, as: :purchasable, dependent: :destroy 
  has_many :items, through: :purchases
end

class Purchase
  belongs_to :purchasable, polymorphic: true
  has_many :items, dependent: :destroy
end

class Item
  belongs_to :purchase
end

问题1: User.first.items 的适当索引是什么?

问题2: 我想查找最近购买的商品,并按商品类别对其进行分组。最有效的索引/arel/sql 是什么?目前,我确信效率很低,代码如下

class User  
  def most_recent_items
    item_ids = Item.select("MAX(id) AS id").group(:category, :puchase_id).collect(&:id) & items.collect(&:id)
    Item.order("created_at DESC").where(:id => item_ids)
  end
end

最佳答案

关于你的第一个问题,我不确定我理解你所说的“适当的索引”是什么意思 - 但如果你的意思是调用 user.items 不适合你,我想最简单的解决方案是在 User.rb 中创建一个类方法。

def items
  purchases.map(&:items).flatten
end

对于第二个,您可以通过多种方式订购商品。如果您的结果是 ActiveRecord Collection,那么您可以使用 order ,就像在示例中一样。如果结果是一个数组,我建议使用 sort_by 方法。

def most_recent_items
  self.items.sort_by(&:created_at)
end

请注意,如果这种排序方式无法将您的项目按照您想要的顺序排列,您只需在末尾添加 .reverse 即可。希望这有帮助!

关于mysql - 轨道 4 : model relationships and indexing for two has_many through models,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50290475/

相关文章:

mysql - HABTM 查询帮助 (Rails 3)

mysql - 使用用户输入进行数据库规范化

mysql - 优化慢速 SELECT 查询

php - 插入新记录时将一个表中的 ID 插入到另一个表中

ajax - 导轨 : link_to with remote true and opening it in a new tab or window

ruby-on-rails - 高效的批量更新 rails 数据库

mysql - 对多个日期运行复杂的查询

activerecord - 在 Rails 4 中,Model.scoped 已被弃用,但 Model.all 无法替代它

ruby-on-rails-4 - 将Rails 4 has_many从proc条件转换为where

ruby - 使用 id 作为 ActiveRecord 中的普通列