Rails查询 – 每天的最新post

User has_many Posts 。 我想检索每天的最新post(使用created_at ),忽略可能早先写过的其他post。 提出这个问题的另一种方法可能是按部门要求每个收入最高的员工 – 我认为这是同样的事情。

如何在Rails中编写此查询(最好是4.0)? 我认为它与groupmaximum但我似乎无法得到它。 有没有办法在不诉诸SQL的情况下做到这一点?

为了澄清,我想要返回的是一系列post对象,它们是各自日期写的最后一个。

谢谢!

它不是很干净,但这可以在Rails 3中使用(在我的案例中取自Book模型),使用PostgreSQL语法将created_at截断为日期:

 max_created_at_list = Book.select("max(created_at) as created_at").group("date_trunc('day',created_at)") last_books = Book.where(:created_at => max_created_at_list) 

… 要不就:

 Book.where(:created_at =>Book.select("max(created_at) as created_at").group("date_trunc('day',created_at)")) 

您需要在大数据集的created_at上使用索引,并且在数据库级别将created_at约束为非null,或者如果您使用的RDBMS不为索引空值(例如Oracle),则将其设置为“非空”谓词

像这样的东西。 您可以根据需要将其转换为AREL语法:

 SELECT posts.created_at, * FROM posts INNER JOIN ( SELECT MAX(created_at) AS max_order_date FROM posts GROUP BY DATE(posts.created_at) ) AS last_postings ON last_postings.max_order_date = posts.created_at ORDER BY DATE(created_at) DESC LIMIT 10 

AREL语法可能是:

 join_sql = <<-SQL INNER JOIN ( SELECT MAX(created_at) AS max_order_date FROM posts GROUP BY DATE(posts.created_at) ) AS last_postings ON last_postings.max_order_date = posts.created_at SQL Post.joins(join_sql).order('DATE(created_at) DESC') 

取下适合您的LIMIT

试试这个

 Post.select("user_id, max(created_at) as created_at").group(:user_id)