繁体   English   中英

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

[英]How do I use the value of an attribute within a model? Ruby on Rails

基本上,我有一个degree_type模型,它具有三个属性: degree_typeawarded_bydate_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_valuesnil ,没有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM