Rails:仅当另一个属性具有指定值时才使用validates_presence_of属性

时间:2014-01-06 16:22:59

标签: ruby-on-rails

我有2个型号:

  1. 类型 - 包含数据类型的模型
  2. 数据 - 包含数据的模型
  3. 模型类型

    • id - 键
    • name - 输入姓名

    模型数据

    • id - 键
    • type_id - 数据类型的ID
    • main_value - 必填数据
    • opt_value - 可选数据(仅限指定数据类型)

    如果我知道指定的validates_presence_of存在且无法更改,我该如何opt_value type.name

    我试过这个方法:

    validates_presence_of :opt_value, :if => lambda { self.type_id == get_type_id }
    
    def get_type_id
      Type.find_by(name: 'i_know_this_type_exists') # with and without .id
    end
    

    但它不起作用。我想是因为我无法从Data模型访问Type模型。

    虽然我可以在迁移中插入预定义的数据类型,并知道哪个id已指定数据类型,但我不想在验证id内对此:if => lambda { self.type_id == 2 }进行硬编码(即使它作品)。

    我如何验证此类案件?

3 个答案:

答案 0 :(得分:1)

你可以试试这个

验证:opt_value,:presence =>是的,:if => Proc.new {| optvalue | optvalue.is_verified? }

   def is_verified?
     self.is_verified == "Verified"
   end

答案 1 :(得分:0)

我认为特殊类型逻辑应该驻留在Type类

class Type < ActiveRecord::Base
  def self.special_type
    Type.find_by(name: 'i_know_this_type_exists').id
  end
end

使用Proc而不是lambda

class Model < ActiveRecord::Base
  validates_presence_of :opt_value, :if => Proc.new{|f| f.type_id == Type.special_type }
end

答案 2 :(得分:0)

我从另一个网站上的用户 alexesDev 得到了这个建议。它有效。

validates_presence_of :opt_value, if: :have_opt_value?

def have_opt_value?
  type_id == Type.select('id').where(name: 'some type').first
end