我试图显示一个多态关系列表,而没有任何重复。
我有一个StoreViews表,其中包含一个称为viewable的多态字段(因此表中有viewable_id和viewable_type列)。现在,我想显示每个多态关系仅显示一次且没有重复的视图。
@views = StoreView.
.distinct(:viewable_id)
.distinct(:viewable_type)
.order("created_at DESC")
.limit(10)
因此,如果StoreViews中有两条记录,它们都具有相同的可视关系,则@views应该只返回最新的一条。但是,事实并非如此。
答案 0 :(得分:6)
ORDER BY
,则 SELECT DISTINCT
项目必须出现在选择列表中。 work around this issue有几种方法。
在此示例中,应使用聚合函数:
@views = StoreView
.select('DISTINCT viewable_type, viewable_id, MAX(created_at)')
.group(:viewable_type, :viewable_id)
.order('MAX(created_at) DESC')
.limit(10)
答案 1 :(得分:6)
distinct
仅接受布尔值作为参数,以指定记录是否唯一。因此,distinct(:viewable_id)
等效于distinct(true)
而不执行您想要的操作。您应该使用group
而不是使用distinct
,它会根据group属性返回一个包含不同记录的数组。要返回最新的字段,除了要按created_at
对group
进行排序(用order
进行排序之外,您还需要在@views = StoreView
.order(viewable_id: :desc, viewable_type: :desc, created_at: :desc)
.group(:viewable_id, :viewable_type)
中添加字段:
created_at
如果您需要按{{1}}对返回的记录进行排序,则需要添加它。
答案 2 :(得分:0)
ActiveRecord不同:
https://apidock.com/rails/ActiveRecord/QueryMethods/distinct
指定记录是否应该唯一。例如:
User.select(:name) # => Might return two records with the same name User.select(:name).distinct # => Returns 1 record per distinct name
如何?
@views = StoreView
.select(:viewable_id, :viewable_type)
.distinct
.order("created_at DESC")
.limit(10)
您也可以尝试
@views = StoreView
.select('DISTINCT `viewable_id`, `viewable_type`')
.order("created_at DESC")
.limit(10)