gpt4 book ai didi

ruby-on-rails - Cast Rails 范围到 Postgres 范围

转载 作者:行者123 更新时间:2023-11-29 12:05:24 27 4
gpt4 key购买 nike

我想知道在数据库中查找行时是否可以强制 Rails 将范围转换为 postgres 范围我的数据库中有一个带有 daterange 列类型的表

 create_table "events", force: true do |t|
......
t.daterange "date"

end

当我插入新行时,Rails 知道如何转换范围例如

Event.create date: Date.today..Date.tomorrow 

按预期工作,我在“事件”表中得到一个新行,其日期值等于“[2014-07-16,2014-07-17)”

但是当我尝试使用 to_formatted(:db) 方法从 db Rails 转换范围中选择行时所以

range = Date.today..Date.tomorrow
Event.find_by date:range

变成

SELECT  "events".* FROM "events"  WHERE ("events"."date" BETWEEN 2014-07-16 AND 2014-07-17) LIMIT 1

而我期望得到的是

SELECT  "events".* FROM "events"  WHERE ("events"."date" [2014-07-16, 2014-07-17) LIMIT 1

我通过向 RANGE_FORMATS 添加新的格式化程序扩展了核心 Range 类

现在使用

Event.find_by date:range.to_s(:pg)

有没有更有效的方法解决问题?

最佳答案

我知道这是一个已有 2 年历史的问题,但我遇到了类似的问题并认为我会分享我的解决方法。

我在 ActiveRecord 模型中定义了一个范围:

scope :score_range, ->(score_range) {
where('course_placement_rubrics.score_range @> numrange(?)', score_range)
}

我这样称呼这个范围:

CoursePlacementRubric.score_range( (0..5.0)  )

ActiveRecord 构建了以下查询:

SELECT "course_placement_rubrics".*
FROM "course_placement_rubrics"
WHERE (course_placement_rubrics.score_range @> numrange(0,1,2,3,4,5))

ActiveRecord 试图提供帮助并迭代我的范围。在您的情况下,ActiveRecord 会尝试提供帮助并使用 BETWEEN..AND 谓词。那显然不是我和你想要的。

这是我的简单解决方法:

scope :score_range, ->(score_range) {
where('course_placement_rubrics.score_range @> numrange(?, ?)', score_range.first, score_range.last)
}

这会输出我想要的查询:

SELECT "course_placement_rubrics".*
FROM "course_placement_rubrics"
WHERE (course_placement_rubrics.score_range @> numrange(0, 5))

希望这对某人有帮助。

关于ruby-on-rails - Cast Rails 范围到 Postgres 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24323305/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com