基本上,我有一个模型,Degree,它有三个属性:degree_type
,awarded_by
和date_awarded
。
有两个值数组应该对awarded_by
有效。 degree_type
的两个有效值为"one"
和"two"
,awarded_by
的有效值取决于"one"
和"two"
。
如果degree_type
为"one"
(值为"one"
,用户会放入),我希望awarded_by
的有效值为{{1} }}。如果array_one
的值为degree_type
,我希望"two"
的有效值为awarded_by
。
以下是目前的代码:
array_two
class Degree < ActiveRecord::Base
extend School
validates :degree_type, presence: true,
inclusion: { in: ["one",
"two"],
message: "is not a valid degree type"
}
validates :awarded_by, presence: true,
inclusion: { in: Degree.schools(awarded_by_type) }
end
根据学位类型输出数组,因此Degree.schools
会返回Degree.schools("one")
,其中
array_one
我的问题是,我不知道如何在模型中访问array_one = ['school01', 'school02'...]
的值。
我在下面尝试的内容并不起作用:
degree_type
我尝试使用validates :awarded_by, presence: true,
inclusion: { in: Degree.schools(:degree_type) }
,但我要么使用不正确,要么还有其他问题,因为我无法解决这个问题。
当我测试时,我得到:
before_type_cast
帮帮我吧? :)如果需要更多信息,请告诉我。
编辑:为了补充这一点,我仔细检查了我的Degree.schools方法是否正常 - 如果我进入rails控制台并尝试An object with the method #include? or a proc, lambda or symbol is required, and must be supplied as the :in (or :within) option of the configuration hash
或Degree.schools("one")
我确实得到了我应该得到的数组。 :)
再次编辑:当我尝试@ Jordan的答案时,我在Degree.schools("two")
不正确的情况下遇到错误,因为在这些情况下,awarded_by
是valid_awarded_by_values
并且那里对于nil对象,没有nil
方法。因此,我添加了一个if语句,检查include?
是否为valid_awarded_by_values
(如果是nil
那么),这就解决了问题!
我把它放在方法中,在unless语句之前和valid_awarded_by_values声明之后:
return
答案 0 :(得分:0)
最简单的方法是编写自定义验证方法as described in the Active Record Validations Rails Guide。
在您的情况下,它可能看起来像这样:
class Degree < ActiveRecord::Base
validate :validate_awarded_by_inclusion_dependent_on_degree_type
# ...
def validate_awarded_by_inclusion_dependent_on_degree_type
valid_awarded_by_values = Degree.schools(degree_type)
unless valid_awarded_by_values.include?(awarded_by)
error_msg = "must be " << valid_awarded_by_values.to_sentence(two_words_connector: ' or ', last_word_connector: ', or ')
errors.add(:awarded_by, error_msg)
end
end
end