У меня есть Rails Concern ExtendedEvent
, который я использую для инкапсуляции логики, относящейся к событиям, которые имеют время начала и время окончания, которых у меня несколько в моем приложении. В настоящее время это выглядит так:
Использование в классе обычно выглядит так:
class InAndOutEvent < ApplicationRecord
include ExtendedEvent
def configure_extended_event
@ee_start_date_time = enter_date_time
@ee_end_date_time = exit_date_time
end
end
Где enter_date_time
и exit_date_time
- атрибуты модели. Однако альтернативное использование будет примерно таким:
class InAndOutEvent < ApplicationRecord
belongs_to: entry
belongs_to: exit
include ExtendedEvent
def configure_extended_event
@ee_start_date_time = entry.date_time
@ee_end_date_time = exit.date_time
end
end
Да, и возможно, что мои entry
и exit
ассоциации на самом деле принадлежат к одному классу, что будет означать использование псевдонимов в запросах:
belongs_to :entry, class_name: "ThingWithDateTime"
belongs_to :exit, class_name: "ThingWithDateTime"
Я хочу определить область действия класса или метод поиска, который позволит мне находить модели, включающие ExtendedEvent
, основываясь на том, перекрываются ли они с заданным временным диапазоном start_time..end_time
. В явно неработающем псевдокоде:
require 'active_support/concern'
module ExtendedEvent
extend ActiveSupport::Concern
class_methods do
def overlaps_with(time_range)
where(ee_start_date_time: time_range)
.or(self.where(ee_end_date_time: time_range))
end
end
# ... instance methods as above omitted
end
Я знаю, что невозможно использовать общий метод, подобный этому, но мое время начала / окончания задается атрибутами модели, поэтому такое ощущение, что это должно быть возможно. Если бы мой атрибут всегда был в модели, я мог бы заменить определение переменных экземпляра на alias_attribute
и использовать это, возможно, как:
alias_attribute :ee_start_time, :enter_date_time
но я не думаю, что это сработало бы с атрибутом ассоциации.
Есть ли способ достичь этого? Я использую Rails 5.1 на Ruby 2.4.