Ruby on rails 如何对关联对象动态提供的属性使用rails验证

Ruby on rails 如何对关联对象动态提供的属性使用rails验证,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,我有User模型,数据库字段为field1到field10,其中一个是email字段 我想像下面那样验证它 validates :field1, format: { .. }, if: Proc.new{ |i| i.active? } 但我的问题是,我不知道哪个是email字段,这取决于UserStructure对象的db字段为email\u字段,这表明User表中哪个是email字段 validates Proc.new{ |i| i.user_st

我有
User
模型,数据库字段为field1到field10,其中一个是email字段

我想像下面那样验证它

validates :field1,
          format: { .. },
          if: Proc.new{ |i| i.active? }
但我的问题是,我不知道哪个是email字段,这取决于
UserStructure
对象的db字段为
email\u字段,这表明
User
表中哪个是email字段

validates Proc.new{ |i| i.user_structure.email_field },
          format: { .. },
          if: Proc.new{ |i| i.active? }
但上述方法不起作用,并且self将始终是用户类(在为用户类加载验证时)

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

您需要一个:

class用户
听起来像是XY的问题。有10个数据库字段名为
field1
field10
,您不知道每个字段实际代表什么,对我来说,这似乎是一个糟糕的设计!!我将重点研究如何将非结构化数据转换为数据库的某种已知结构。即使您可以使此验证生效,您希望将来如何“通过电子邮件找到用户”?查询所有记录的所有10个字段@汤姆洛德:是的,不是糟糕的设计,而是先进的。客户机可以访问用户结构,他可以定义哪个字段是文本框、选择列表还是电子邮件字段文本。客户机有许多用户以所描述的结构形式提供数据。所以你可以说我们的客户正在定义它。它确实非常有效。@TomLord“通过电子邮件查找用户”将显示为
find\u by(email\u字段=>”abc@example.com)
在我看来,这不是一个高级设计,而是一个糟糕的设计。同样,您计划如何通过电子邮件在整个表中搜索用户——而不仅仅是一个客户端定义的记录??更好的办法是将此客户机字段映射抽象到另一个表中,并将users表保留在一个定义良好的结构中。在解决大多数问题之前,我使用了与自定义验证相同的方法,但我想使用rails定义的验证,但仍然要感谢:)
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