如何在模型中使用属性的值? Ruby on Rails

时间:2014-12-03 22:33:47

标签: ruby-on-rails validation models

基本上,我有一个模型,Degree,它有三个属性:degree_typeawarded_bydate_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 hashDegree.schools("one")我确实得到了我应该得到的数组。 :)

再次编辑:当我尝试@ Jordan的答案时,我在Degree.schools("two")不正确的情况下遇到错误,因为在这些情况下,awarded_byvalid_awarded_by_values并且那里对于nil对象,没有nil方法。因此,我添加了一个if语句,检查include?是否为valid_awarded_by_values(如果是nil那么),这就解决了问题!

我把它放在方法中,在unless语句之前和valid_awarded_by_values声明之后:

return

1 个答案:

答案 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