我试图在没有任何重复的情况下显示多态关系的列表。
我有一个StoreViews表,其中有一个名为viewable的多态字段(因此在我的表中有一个viewable_id和viewable_type列)。现在我想显示视图,每个多态关系只显示一次,没有重复。
@views = StoreView.
.distinct(:viewable_id)
.distinct(:viewable_type)
.order("created_at DESC")
.limit(10)因此,如果StoreViews中有两条记录,它们都具有相同的可视关系,则@views应该只返回最近的一条。然而,事实并非如此。
发布于 2018-12-27 16:00:17
如果指定了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)发布于 2018-12-27 18:48:01
distinct只接受布尔值作为参数来指定记录是否应该是唯一的。所以distinct(:viewable_id)等同于distinct(true),而不是做你想做的事情。您应该使用group而不是distinct,它根据group属性返回具有不同记录的数组。要返回最新的字段,除了按created_at排序(使用order)之外,还需要在group中添加字段
@views = StoreView
.order(viewable_id: :desc, viewable_type: :desc, created_at: :desc)
.group(:viewable_id, :viewable_type)如果您需要按created_at对返回的记录进行排序,则需要添加以下内容。
发布于 2018-12-21 16:07:15
不同的ActiveRecord:
https://apidock.com/rails/ActiveRecord/QueryMethods/distinct
指定记录是否应该是唯一的。例如:
User.select(: name ) # =>可能返回两条具有相同名称的记录User.select(: name ).distinct # =>为每个不同的名称返回一条记录
这样如何:
@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)https://stackoverflow.com/questions/53880608
复制相似问题