Ruby on rails RubyonRails:验证两个包含条件的范围

Ruby on rails RubyonRails:验证两个包含条件的范围,ruby-on-rails,Ruby On Rails,我们对模型进行了验证,以验证“建成年份” 此列最近更改为字符串,以允许另外两个选项“待构建”和“新建” 我想确认唯一接受的数据是上面(1900..date)的数据以及这两个字符串: validates :year_built, inclusion: { in: 1900..(Date.today.year) || ['New', 'To Be Built']} 有什么方法可以同时检查这两种情况吗?有关详细信息,请参见此处 包含验证器是范围或数组的基本验证器,但不允许这种类型的“条件”逻辑 虽然

我们对模型进行了验证,以验证“建成年份”

此列最近更改为字符串,以允许另外两个选项“待构建”和“新建”

我想确认唯一接受的数据是上面(1900..date)的数据以及这两个字符串:

validates :year_built, inclusion: { in: 1900..(Date.today.year) || ['New', 'To Be Built']}
有什么方法可以同时检查这两种情况吗?

有关详细信息,请参见此处

包含验证器是范围或数组的基本验证器,但不允许这种类型的“条件”逻辑

虽然我怀疑将年份列更改为字符串从一开始就是最好的选择(),但您可以调整您的想法并
映射
/
收集您想要匹配的年份,并将其他选项添加到该数组中,例如:

validates :year_built, inclusion: { in: (1900..(Date.today.year)).collect(&:to_s) + ['New', 'To Be Built']}

但我认为这个选项在一行难以解析的代码中放得太多了。如果你想让你的列保持一个字符串列,你应该考虑编写一个自定义的验证器函数,参见:

<代码>:(‘1900’…日期。今天。如果你想把它写下来作为一个答案,我会接受。注意你有一个微妙的错误<代码>日期。今天。年份将在加载类时计算。如果在12月31日加载该类,然后在1月份应用验证,则可能会意外失败。谢谢。我想我可以把它保持为整数,把这两个选项设为0和1?专栏上不会做算术运算,所以我认为这没什么大不了的。现在可能没什么大不了的,但我通常更喜欢保持类型的可预测性(也许有一天你会看到每十年一次的建筑)。我宁愿引入另一个列来表示,例如state,它将包含例如“to_be__build”、“new”和“build”(另一个要验证的列;)中的一个,然后是一个条件验证,如
验证:year_builded,inclusion:{in:1900..(Date.today.year)},if::builded?
取决于方法
\builded?
validates :year_built, inclusion: { in: (1900..(Date.today.year)).collect(&:to_s) + ['New', 'To Be Built']}