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。您是否找到了解决方案?我也有同样的问题。即使我把订单
放在组
之前,组
总是发生在订单
之前。你有没有找到解决办法?我也有同样的问题。即使我把顺序
放在组
之前,组
总是在顺序
之前发生。