ruby-on-rails - Cast Rails 系列到 Postgres 系列

标签 ruby-on-rails postgresql range

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

 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/

相关文章:

ruby-on-rails - Rails 属性别名

ruby-on-rails - 如何按数组中的单个元素分组

arrays - Go:多维数组的范围和长度?

mySQL 在一天中的几个小时到午夜之间收集数据,并以日期增量进行

flash - ActionScript 2 在 4 个数字之间随机

ruby-on-rails - Nokogiri 和 Rails 不会安装。 [Ruby On Rails]

ruby-on-rails - PG::UndefinedTable: 错误:关系 "action_text_rich_texts"不存在 | rails 6 | Rails_管理员 | PostgreSQL

sql - 有条件地加入 Postgres

c# - 每当更新数据库中的字段时调用外部 API

SQL 按相似字段值分组