作为标题中,我想显示一个用户的列表,该列表由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,但是可以使用limit
和offset
例如:
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)
希望这会有所帮助!