2

一个Userhas_many Posts。我想检索每天的最新帖子(使用created_at),忽略之前可能写过的其他帖子。提出这个问题的另一种方法可能是按部门要求每个收入最高的员工——我想也是这样。

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

澄清一下,我想要返回的是一组 post 对象,它们是在各自日期写的最后一个对象。

谢谢!

4

3 回答 3

2

像这样的东西。您可以根据需要将其转换为 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适合您的。

于 2013-06-10T18:39:59.573 回答
1

它不是很干净,但这适用于 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 上为大型数据集创建索引,并且如果您使用的 RDBMS 不索引空值(例如 Oracle),则 created_at 在数据库级别被限制为不为空或“不为空”谓词

于 2013-06-10T18:41:35.223 回答
0

尝试这个

Post.select("user_id, max(created_at) as created_at").group(:user_id)
于 2013-06-10T18:21:26.137 回答