ruby-on-rails - 有没有办法省略 Active Record 转换(来自 postgres 范围)?
问题描述
我有一个方法可以检查我的模型实例的日期交叉点。
def intersections
Reservation.where("daterange && ?", self.daterange)
end
假设我有预订r = Reservation.last
=> #<Reservation id: 3, home_id: 1, daterange: Sun, 10 Feb 2020...Fri, 21 Feb 2020>
r.intersections
异常查询:
SELECT "reservations".* FROM "reservations" WHERE (daterange && '[2020-02-10,2020-02-21)')
实际查询:
SELECT "reservations".* FROM "reservations" WHERE (daterange && '2020-02-10','2020-02-11','2020-02-12','2020-02-13','2020-02-14','2020-02-15','2020-02-16','2020-02-17','2020-02-18','2020-02-19','2020-02-20')
架构:
create_table "reservations", force: :cascade do |t|
...
t.daterange "daterange"
end
我尝试了很多变体,但似乎演员隐藏在 Active Record 深处的某个地方。我可以为这个查询关闭它吗?
解决方案
您可以使用 Attributes API 来设置转换。
class Reservation < ApplicationRecord
attribute :daterange, range: true
def intersections
Reservation.where(
"daterange && ?", self.daterange
)
end
end
irb(main):026:0> Reservation.first.intersections
Reservation Load (0.6ms) SELECT "reservations".* FROM "reservations" ORDER BY "reservations"."id" ASC LIMIT $1 [["LIMIT", 1]]
Reservation Load (0.6ms) SELECT "reservations".* FROM "reservations" WHERE (daterange && '[2020-02-14,2020-02-16)') LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Reservation id: 1, daterange: "[2020-02-14,2020-02-16)", created_at: "2020-02-14 11:13:13", updated_at: "2020-02-14 11:13:13">, #<Reservation id: 2, daterange: "(,)", created_at: "2020-02-14 11:33:16", updated_at: "2020-02-14 11:33:16">]>
推荐阅读
- actions-on-google - 在 Google SmartHome API 的 reportState 中,temperatureK 和spectrumRgb 似乎不能一起工作
- android - 如何像 emulator-xxxx 一样打开 adb connect memu(没有 tcpip)?
- java - 模拟私有方法时,Powermock 抛出 InvalidUseOfMatchersException
- python - 使用 pthread_setname_np 时出现分段错误
- angular - 社交媒体的 Angular Meta 标签无法抓取
- git - Git - 查找带有以开头的标签的修订
- javascript - 如果更新了原始数组,地图会自动更新吗?
- c++ - 为什么将虚函数隐藏在非虚等号后面
- python - Savefig 以与给定大小不同的大小保存图像
- c++ - 带有类型推导的构造函数中的通用引用