Rails tsrange 类型的表单助手

Rails form helper for type tsrange

我有一个 period 字段类型为 tsrange 的记录。 我正在制作一个表格来创建它,我想继续使用 rails 表格助手 - 我想知道是否有某种约定来设置范围的 beginend?

在我看来:

<%= form_with(model: @record) do |record_form| %>
<%= record_form.datetime_local_field :period %>
<% end %>

导致错误undefined method 'strftime' for Mon, 01 Jan 1996 09:00:00 +0000..Mon, 01 Jan 1996 17:00:00 +0000:Range

这是有道理的,因为我不能直接为范围创建一个输入,但似乎没有任何方法可以将范围属性解压缩到它的 beginend类似

的方法

<%= record_form.datetime_local_field :period_begin %>

因为那个错误

undefined method 'period_begin' for #<ShiftPeriod id: nil, shift_pattern_id: nil, period: Mon, 01 Jan 1996 09:00:00 +0000..Mon, 01 Jan 1996 17:00:00 +0000, created_at: nil, updated_at: nil>

除了手动构建输入之外,还有什么方法可以为此范围字段类型构建输入吗? 谢谢!

我认为您必须为这些值添加自定义 getter 和 setter:

def period_begin
  # using read_attribute because I'm redefining the `period` getter at the end
  @period_begin = read_attribute(:period)&.begin
end

def period_end
  @period_end = read_attribute(:period)&.end
end

def period_begin=(value)
  @period_begin = value
end

def period_end=(value)
  @period_end = value
end

def period
  period_begin..period_end if period_begin && period_end
end

对此不是 100% 确定(我从未使用过 tsrange 类型),但希望这个想法(也许每个 getter/setter 的实现都不正确)对您有所帮助。

然后 period_endperiod_begin 应该在呈现表单时起作用,并且在您提交表单时设置属性时应该起作用。