如何将Rails验证用于从关联对象动态提供的属性

时间:2018-11-02 07:31:23

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有一个User模型,其数据库字段是从field1到field10,其中之一是电子邮件字段。

我想像下面那样验证它,

validates :field1,
          format: { .. },
          if: Proc.new{ |i| i.active? }

但是我的问题是,我不知道哪个是电子邮件字段,它取决于UserStructure对象,该对象的数据库字段为email_field,这暗示了User表中的哪个电子邮件字段

validates Proc.new{ |i| i.user_structure.email_field },
          format: { .. },
          if: Proc.new{ |i| i.active? }

但是上面的方法不起作用,self始终是User类(在加载User类的验证时)

请纠正我或建议是否有其他选择。 提前致谢。

1 个答案:

答案 0 :(得分:1)

您需要一个custom validation

class User < ApplicationRecord
  validate :user_email_should_be_valid

  def user_email_should_be_valid
    email_field = user_structure.email_field
    email = send(email_field)

    if active? && !email.match?(EMAIL_REGEXP)
      errors.add(email_field.to_sym, "should be a valid email address")
    end
  end
end