一个User
has_many Posts
。我想检索每天的最新帖子(使用created_at
),忽略之前可能写过的其他帖子。提出这个问题的另一种方法可能是按部门要求每个收入最高的员工——我想也是这样。
如何在 Rails 中编写此查询(最好是 4.0)?我认为这与它有关group
,maximum
但我似乎无法理解。有没有办法在不使用 SQL 的情况下做到这一点?
澄清一下,我想要返回的是一组 post 对象,它们是在各自日期写的最后一个对象。
谢谢!
一个User
has_many Posts
。我想检索每天的最新帖子(使用created_at
),忽略之前可能写过的其他帖子。提出这个问题的另一种方法可能是按部门要求每个收入最高的员工——我想也是这样。
如何在 Rails 中编写此查询(最好是 4.0)?我认为这与它有关group
,maximum
但我似乎无法理解。有没有办法在不使用 SQL 的情况下做到这一点?
澄清一下,我想要返回的是一组 post 对象,它们是在各自日期写的最后一个对象。
谢谢!
像这样的东西。您可以根据需要将其转换为 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
适合您的。
它不是很干净,但这适用于 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 在数据库级别被限制为不为空或“不为空”谓词
尝试这个
Post.select("user_id, max(created_at) as created_at").group(:user_id)