我的场景如下
公司 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/