我有一个有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} - 但是后来得到一个错误,该对象没有响应包含?
答案 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