Rails 3验证包含何时使用find(如何proc或lambda)

时间:2011-02-17 21:38:47

标签: ruby-on-rails ruby validation activerecord

我有一个有CURRENCY和COUNTRY表的项目。有一个PRICE模型需要有效的货币和国家代码,所以我有以下验证:

validates :currency_code, :presence => true, :inclusion => { :in => Currency.all_codes }
validates :country_code, :presence => true, :inclusion => { :in => Country.all_codes }

all_codes方法返回仅包含货币或国家/地区代码的数组。这有效 只要没有代码添加到表中就可以了。

你如何写这个,以便Currency.all_codes的结果是Proc或lambda内?我尝试了Proc.new {Currency.all_codes} - 但是后来得到一个错误,该对象没有响应包含?

2 个答案:

答案 0 :(得分:63)

只需使用proc,就像这样:

validates :currency_code,
          :presence => true,
          :inclusion => { :in => proc { Currency.all_codes } }
validates :country_code,
          :presence => true,
          :inclusion => { :in => proc { Country.all_codes } }

值得注意的是,对于可能偶然发现这一点的人来说,proc也可以将记录作为参数访问。所以你可以这样做:

validates :currency_code,
          :presence => true,
          :inclusion => { :in => proc { |record| record.all_codes } }

def all_codes
  ['some', 'dynamic', 'result', 'based', 'upon', 'the', 'record']
end

答案 1 :(得分:4)

注意:对于旧版本的Rails,这个答案是正确的,但对于Rails 3.1及更高版本,可以接受proc。

它不能接受Procs。您可以使用自定义验证方法执行相同的操作:

validate :currency_code_exists

def currency_code_exists
    errors.add(:base, "Currency code must exist") unless Currency.all_codes.include?(self.currency_code)
end