Ruby on rails ActiveRecord在排序前对组进行排序的方法

Ruby on rails ActiveRecord在排序前对组进行排序的方法,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有此活动记录查询: @reviews = Review.limit(30).group('user_id').order('created_at desc') 我使用group方法来确保每个用户只显示一条评论。 问题是,此审查不一定是该用户最后创建的审查 我知道分组是在排序之前进行的,所以在调用order之前是否可以对组进行排序?我已经找到了许多关于这个问题的答案,但每个问题都需要原始sql,当您有简单的查询时,您可以使用它,对于您的输入,它将是这样的: ids = Review.group

我有此活动记录查询:

@reviews = Review.limit(30).group('user_id').order('created_at desc')
我使用group方法来确保每个用户只显示一条评论。 问题是,此审查不一定是该用户最后创建的审查


我知道分组是在排序之前进行的,所以在调用order之前是否可以对组进行排序?

我已经找到了许多关于这个问题的答案,但每个问题都需要原始sql,当您有简单的查询时,您可以使用它,对于您的输入,它将是这样的:

ids = Review.group(:user_id).maximum(:created_at).keys
@reviews = Review.limit(30).where(:id => ids).order(:created_at)
Review.find_by_sql(
 "SELECT * FROM (
 SELECT * FROM reviews
 ORDER BY reviews.created_at DESC ) as my_table
 group by my_table.user_id
 LIMIT 30"
)
但是,如果查询更复杂,需要更多连接,那么您可以使用前面提到的几乎不错的解决方案,我不确定这是否是最佳解决方案,但它对我有效:

ids = Review.order('created_at DESC').pluck(:id)
@reviews = Review.where(id: ids).group(:user_id).limit(30)
编辑:是的,最后一个解决方案不正确,因为它对数据库执行两个查询。今天我无意中又回到了这个问题,我使用了
to_sql
方法(随>Rails 3.0一起提供)以及第一个解决方案,对我来说它是完美的-1。还有一个问题,2。子查询可以像您希望的那样复杂,并且代码可读性将保持不变:

Review.find_by_sql(
     "SELECT * FROM (
     #{ Review.order(:created_at).to_sql }
     ) as my_table
     group by my_table.user_id
     LIMIT 30"
    )

我已经找到了这个问题的许多答案,但每个答案都需要原始sql,当您有简单的查询时,您可以使用它,对于您的输入,它将是这样的:

Review.find_by_sql(
 "SELECT * FROM (
 SELECT * FROM reviews
 ORDER BY reviews.created_at DESC ) as my_table
 group by my_table.user_id
 LIMIT 30"
)
但是,如果查询更复杂,需要更多连接,那么您可以使用前面提到的几乎不错的解决方案,我不确定这是否是最佳解决方案,但它对我有效:

ids = Review.order('created_at DESC').pluck(:id)
@reviews = Review.where(id: ids).group(:user_id).limit(30)
编辑:是的,最后一个解决方案不正确,因为它对数据库执行两个查询。今天我无意中又回到了这个问题,我使用了
to_sql
方法(随>Rails 3.0一起提供)以及第一个解决方案,对我来说它是完美的-1。还有一个问题,2。子查询可以像您希望的那样复杂,并且代码可读性将保持不变:

Review.find_by_sql(
     "SELECT * FROM (
     #{ Review.order(:created_at).to_sql }
     ) as my_table
     group by my_table.user_id
     LIMIT 30"
    )

这似乎对我不起作用。我仍然为每个用户提供最早的评论。我怀疑这是由于最大(:created_at)调用。如果我想按分散顺序列出,那么我会“在描述时创建”,但它看起来似乎与描述参数不一样。您是否尝试过
@reviews=Review.limit(30)。其中(:id=>ids.order('created_at desc')
?是的,也尝试过了。第一条语句返回的所有ID都是该用户第一次查看的ID。这似乎对我不起作用。我仍然为每个用户提供最早的评论。我怀疑这是由于最大(:created_at)调用。如果我想按分散顺序列出,那么我会“在描述时创建”,但它看起来似乎与描述参数不一样。您是否尝试过
@reviews=Review.limit(30)。其中(:id=>ids.order('created_at desc')
?是的,也尝试过了。第一条语句返回的所有ID都是该用户第一次查看的ID。您是否找到了解决方案?我也有同样的问题。即使我把
订单
放在
之前,
总是发生在
订单
之前。你有没有找到解决办法?我也有同样的问题。即使我把
顺序
放在
之前,
总是在
顺序
之前发生。