Activerecord PSQL由HAS_MANY关联 分页的最新创建_AT排序



作为标题中,我想显示一个用户的列表,该列表由has_many关联的最新创建。

User
  has_many :interactions

我需要能够用用户显示一个表格的表格,该表被用户排序了,该表也应显示交互的总数(不使用DB中的counter_cache),还包括分页。

我们一直使用的先前(不工作)范围是 User.with_a_bunch_of_scopes.includes(:interactions).order("interactions.created_at DESC")的行我已经删除了大多数尝试,但是我尝试使用MAX(interactions.created_at)并通过各种其他属性进行分组,但无济于事。

分页是这里很难的部分 - 除非我弄乱了某些东西,否则使用:includes/LEFT OUTER JOIN可以适当地限制每次互动的一个用户,但是,这似乎是由其他交互作用的范围。我正在使用Kaminari Gem,但是可以使用limitoffset

复制问题

例如:

Interaction Users sorted_by interactions.created_at
-------------------------
User 1
User 1
User 2
User 3
User 2
User 2
User 4
User 1
User 4
User 3
User 5

给我们:

Page # per 4
Page 1 - [1, 2, 3, 4]
Page 2 - [2, 4, 1, 3]
Page 3 - [4, 3, 5]

我们希望它是:

Page # per 4
Page 1 - [1, 2, 3, 4]
Page 2 - [5]

它仅适当地仅包含每个用户一次,但是,当已经包含在以前的页面上时,它包括页面上的用户。

任何帮助将不胜感激。不时地回到这个问题,然后尝试解决它一段时间,永远无法按预期返回。

假设您需要一系列用户对象,并且由于您动态生成每个用户的交互作用,因此您可以通过映射as_json的CC_10来执行此操作(以及分页)在所有排序的互动中:

User.includes(:interactions).order('interactions.created_at desc').uniq.page(params[:page]).per(4).map(&:as_json)

要使map(&:as_json)工作要覆盖用户模型中的as_json方法,并包括一种计算交互计数的方法。例如:

def as_json(_opts={})
  super(_opts.merge({
    methods: [ :interactions_count ]
  }))
end
def interactions_count
  interactions.size
end

这应该为您提供一系列用户对象,包括其交互作用。如果您只是寻找用户ID,则可以做:

User.includes(:interactions).order('interactions.created_at desc').uniq.page(params[:page]).per(4).pluck(:id)

希望这会有所帮助!

最新更新