复杂Rails Active Record查询选择具有真实结果的记录,以便当天最新更新其他创建的记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复杂Rails Active Record查询选择具有真实结果的记录,以便当天最新更新其他创建的记录相关的知识,希望对你有一定的参考价值。
我在表中有重要的列,
- customer_approval(boolean)
- created_at(datetime)
- updated_at(datetime)
当天可能存在多条记录。一天的这些记录可能将customer_approval标记为TRUE。
我们如何编写查询来获取结果集,如下所示:
- 即使当天有多个记录,也每天只选择一条记录
- 必须首先选择记录,以记录customer_approval为true的位置
- 如果记录不符合上述条件,请选择当天根据created_at或updated_at列创建或更新的最新条目
- 创建时,根据日期范围(从日期 - 到日期)选择所有记录。
还添加了一个示例:表数据
+--------+-------------------+------------+------------+
| row_id | customer_approval | created_at | updated_at |
+--------+-------------------+------------+------------+
| 1 | TRUE | 2017-12-01 | 2017-12-01 |
| 2 | FALSE | 2017-12-01 | 2017-12-01 |
| 3 | NIL | 2017-12-01 | 2017-12-01 |
| 4 | NIL | 2017-12-02 | 2017-12-02 |
| 5 | FALSE | 2017-12-03 | 2017-12-03 |
| 6 | NIL | 2017-12-03 | 2017-12-03 |
| 7 | NIL | 2017-12-04 | 2017-12-05 |
+--------+-------------------+------------+------------+
2017-12-01和2017-12-05日期范围的预期结果集:
+--------+-------------------+------------+------------+
| row_id | customer_approval | created_at | updated_at |
+--------+-------------------+------------+------------+
| 1 | TRUE | 2017-12-01 | 2017-12-01 |
| 4 | NIL | 2017-12-02 | 2017-12-02 |
| 6 | NIL | 2017-12-03 | 2017-12-03 |
| 7 | NIL | 2017-12-04 | 2017-12-05 |
+--------+-------------------+------------+------------+
提前致谢。
附:抱歉可怜的表格式。
答案
Postgresql查询
SELECT DISTINCT ON (created_at) row_id, customer_approval, created_at
FROM the_table
ORDER BY customer_approval DESC, created_at DESC;
在铁轨中
TheTable.select("DISTINCT ON (created_at) row_id, customer_approval, created_at")
.order(customer_approval: :desc, created_at: :desc )
另一答案
我知道这不完美,你应该考虑例外。
模型
class Customer < ApplicationRecord
scope :approval, -> { where customer_approval: true }
scope :waiting, -> { where customer_approval: nil }
scope :for_day, ->(date) {
where(
arel_table[:created_at].eq(date)
.or(arel_table[:updated_at].eq(date))
)
}
def self.last_change
order(created_at: :desc, updated_at: :desc).first
end
end
调节器
def fetch_customers(first, last)
result = []
first.upto(last) do |date|
customer = Customer.for_day(date).approval.first
customer ? (result << customer) : (result << Customer.for_day(date).waiting.last_change)
end
result
end
# first = Date.parse('2017-12-01')
# last = Date.parse('2017-12-05')
# fetch_customer(first, last)
附:希望你的rails版本4+(适用于Arel表格)
以上是关于复杂Rails Active Record查询选择具有真实结果的记录,以便当天最新更新其他创建的记录的主要内容,如果未能解决你的问题,请参考以下文章
Postgres / Rails Active Record - 查询四舍五入的浮点值
Rails 4 - 从已过滤的 Active Record 查询中删除属性