Есть ли способ пропустить активную запись (из диапазонов postgres)? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть метод, который проверяет пересечения дат для экземпляра моей модели.

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. Могу ли я просто отключить его для этого запроса?

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете использовать 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">]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...