ruby-on-rails-3 – Rails 3:.group()按created_at排序

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – Rails 3:.group()按created_at排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
什么是Rails 3的方式来排序.group()导致Activerecord(这里是“created_at”)?
@messages = Message.group(:foo)

只会显示最旧的消息.我需要最新的显示.

我试过了

@messages = Message.group(:foo).having("created_at = MAX(created_at)")

没有成功.任何提示赞赏!

澄清:我正在寻找组内订购,而不是一般的message.order(“…”).
如果没有简单的Activerecord语法,我也会对原始sql感到满意

更新:尝试sql方式,这应该是工作:

@messages = Message.find_by_sql("
  SELECT messages.* 
  FROM messages 
  GROUP BY messages.foo 
  HAVING messages.created_at = MAX(messages.created_at) 
  ORDER BY messages.created_at DESC")

但是,这仅检索单个记录(那些未分组的记录).假设组合的被省略.不知道为什么,所有记录都有:created_at和foo值

解决方法

在某些数据库下,您不能在同一个查询中使用order然后组,因此您需要使用两个查询
message_ids = Message.select("MAX(id) AS id").group(:foo).collect(&:id)
@messages = Message.order("created_at DESC").where(:id => message_ids)

注意:这假设您有一个自动递增的ID列,这是大多数Rails表所做的.

原文链接:https://www.f2er.com/ruby/271645.html

猜你在找的Ruby相关文章