在我的Ruby on Rails应用程序中,我的数据库 struct 如下:

Project.create(:group => "1", :date => "2014-01-01")
Project.create(:group => "1", :date => "2014-01-02")
Project.create(:group => "1", :date => "2014-01-03")

Project.create(:group => "2", :date => "2014-01-01")
Project.create(:group => "2", :date => "2014-01-02")
Project.create(:group => "2", :date => "2014-01-03")

# and so forth...

如何使用ActiveRecord从每group条中获取最新记录?

解决方案可能很简单,但我无法理解这一点.

谢谢你的帮助.

推荐答案

博士后

在博士后中,这可以通过以下查询实现.

SELECT DISTINCT ON ("group") * FROM projects
ORDER BY "group", date DESC, id DESC

因为date列在这里可能不是唯一的,所以我在id DESC上增加了一个ORDER BY子句,以打破有利于ID更高的记录的关系,以防一个组中的两个记录具有相同的日期.相反,您可能希望使用另一列,比如上次更新的日期/时间,这取决于您的用例.

接下来,很遗憾,ActiveRecord没有适用于DISTINCT ON的API,但我们仍然可以在select中使用普通SQL:

Project.select('DISTINCT ON ("group") *').order(:group, date: :desc, id: :desc)

或者,如果您更喜欢使用ARel而不是原始SQL:

p = Project.arel_table
Project.find_by_sql(
  p.project(p[Arel.star])
   .distinct_on(p[:group])
   .order(p[:group], p[:date].desc, p[:id].desc)
)

MySQL

不幸的是,对于像MySQL这样的其他数据库,这并没有那么方便.有多种解决方案可供 Select ,例如this answer.

Ruby-on-rails相关问答推荐

如何修改使用Google Cloud App Engine部署rails 7应用程序的步骤

错误AESGCMOpen获取密码:消息身份验证失败:Golang解密GCM

引用连接 Rails 表中枚举的查询

Rails 6:强类型原始 SQL 查询返回数组类型

Rails 7 应用程序 - 引用模型文件时出现未初始化常量错误

Rspec期望()与期望{}

ViewModel 和 Controller 有什么区别?

Mongoid 3 + Heroku (MongoHQ) 导致 Moped::Errors::OperationFailure

Ruby Sinatra Web 服务在 localhost:4567 上运行,但不在 IP 上

rails select标签,预先 Select 了多个值

如何获取 Ruby on Rails 生成的表单元素 id 以供 JavaScript 参考?

fields_for 表单构建器对象为零

如何将自定义过滤器添加到 Active Admin?

带有查询字符串参数的 Rails 动作缓存

Rails 文章助手 - a 或 an

如何编写 Capybara 断言来判断按钮的存在及其启用或禁用状态?

从 Rails 中的控制器调用辅助方法时出现未定义的方法

在 Rails 中命名布尔列

如何翻译 ActiveRecord 模型类名称?

如何使用 url 连接到 postgresql