[英]How do I use the value of an attribute within a model? Ruby on Rails
基本上,我有一个degree_type
模型,它具有三个属性: degree_type
, awarded_by
和date_awarded
。
有两个值数组应该对awarded_by
有效。 degree_type
的两个有效值是"one"
和"two"
, awarded_by
取决于"one"
和"two"
。
如果degree_type
为"one"
(用户将输入的值为"one"
),则我想将awarded_by
的有效值设为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
但是我使用不正确,或者出现了另一个问题,因为我也无法使用它。
当我测试时,我得到:
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方法起作用的-如果我进入rails控制台并尝试Degree.schools("one")
或Degree.schools("two")
我会做得到我应该得到的数组。 :)
再次编辑:当我尝试awarded_by
的答案时,在awarded_by
不正确的情况下出现错误,因为在这些情况下, valid_awarded_by_values
为nil
,没有include?
nil对象的方法。 因此,我添加了一个if语句来检查valid_awarded_by_values
是否为nil
(以便return
是否为nil
),从而解决了该问题!
我将其放在方法中,在except语句之前和valid_awarded_by_values声明之后:
if valid_awarded_by_values.nil?
error_msg = "is not a valid awarded_by"
errors.add(:awarded_by, error_msg)
return
end
最简单的方法是编写一个自定义验证方法, 如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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.