【发布时间】:2019-03-05 11:28:13
【问题描述】:
我有一个 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"
我想定义一个类级别的范围或查找器方法,它允许我根据它们是否与给定的时间范围 start_time..end_time 重叠来查找包含 ExtendedEvent 的模型。在明显损坏的伪代码中:
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
但我认为这不适用于关联的属性。
有什么方法可以实现吗?我在 Ruby 2.4 上使用 Rails 5.1。
【问题讨论】:
标签: ruby-on-rails ruby rails-activerecord