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

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

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} – 然后得到一个错误,该对象没有响应包含?

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

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

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

只需使用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