如何获得明显的多态关联

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应仅返回最新的记录.然而,这种情况并非如此.

spi*_*ann 6

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)


Ana*_*mez 6

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,则需要添加此记录.


ore*_*ren 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
Run Code Online (Sandbox Code Playgroud)

这个怎么样:

@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)