ActiveRecord:用户特定的验证

时间:2010-07-21 22:50:19

标签: ruby-on-rails ruby activerecord

我想创建特定于用户的验证。

用户有一个名为“rule_values”的列,它是某些数量的序列化哈希值。

在另一个模型中,Foo,我有一个验证:

class Foo < ActiveRecord::Base
  belongs_to :user

  n = self.user.rule_values[:max_awesome_rating] #this line is giving me trouble!
  validates_presence_of :awesome_rating, :in => 1..n
end

似乎self指的是Foo(这就是为什么我得到一个未定义的方法错误)而不是Foo的实例。如何从Foo模型中访问User实例?

2 个答案:

答案 0 :(得分:1)

如何在这样的Foo上创建自定义验证?

class Foo < ActiveRecord::Base

  validate do |foo|
    n = foo.user.rule_values[:max_awesome_rating]
    unless (1..n).include? foo.awesome_rating
      foo.errors.add :awesome_rating, "must be present and be between 1 and #{n}"
    end
  end

end

这样您就可以访问实例和用户关联

答案 1 :(得分:1)

Rails支持自定义验证(使用validate)。这里有一个关于它如何工作的想法(虽然没有检查):

class Foo < ActiveRecord::Base
  belongs_to :user
  validate :awesome_rating_is_in_range

  def awesome_rating_is_in_range
    errors.add(:awesome_rating, 'not in range') unless (1..user.rule_values[:max_awesome_rating]).include? awesome_rating
  end
end