Nat*_*anB 6 ruby sql database postgresql ruby-on-rails
我试图显示一个多态关系列表,没有任何重复.
我有一个StoreViews表,其中包含一个名为viewable的多态字段(因此我的表中有一个viewable_id和viewable_type列).现在我想显示每个多态关系只显示一次的视图,没有重复.
@views = StoreView.
.distinct(:viewable_id)
.distinct(:viewable_type)
.order("created_at DESC")
.limit(10)
Run Code Online (Sandbox Code Playgroud)
因此,如果StoreView中存在两条具有相同可视关系的记录,则@views应仅返回最新的记录.然而,这种情况并非如此.
ORDER BY如果SELECT DISTINCT已指定,则项目必须出现在选择列表中.有几种方法可以解决此问题.
在此示例中,使用聚合函数应该起作用:
@views = StoreView
.select('DISTINCT viewable_type, viewable_id, MAX(created_at)')
.group(:viewable_type, :viewable_id)
.order('MAX(created_at) DESC')
.limit(10)
Run Code Online (Sandbox Code Playgroud)
distinct只接受布尔值作为参数来指定记录是否应该是唯一的.所以distinct(:viewable_id)相当于distinct(true)而不是做你想要的.distinct您应该使用group,而不是使用,它返回一个基于组属性具有不同记录的数组.要返回最新的一个,除了订购(with order)by之外created_at,还需要在以下位置添加字段group:
@views = StoreView
.order(viewable_id: :desc, viewable_type: :desc, created_at: :desc)
.group(:viewable_id, :viewable_type)
Run Code Online (Sandbox Code Playgroud)
如果您需要按顺序排列返回的记录created_at,则需要添加此记录.
ActiveRecord 的独特之处:
https://apidock.com/rails/ActiveRecord/QueryMethods/distinct
指定记录是否应该是唯一的。例如:
Run Code Online (Sandbox Code Playgroud)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)
Run Code Online (Sandbox Code Playgroud)
你也可以尝试
@views = StoreView
.select('DISTINCT `viewable_id`, `viewable_type`')
.order("created_at DESC")
.limit(10)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
343 次 |
| 最近记录: |