假设我有一个这样的模型:
class Taskable < ActiveRecord::Base
has_many :deliveries
has_many :packages
has_many :supplies
validate :can_have_only_one_type_of_association
private
def can_have_only_one_type_of_association
unless [deliveries, packages, supplies].count(:any?) <= 1
errors.add(:base, :can_have_only_one_type_of_association) # becomes invalid if at least two associations present
end
end
end
该模型具有验证方法can_have_only_one_type_of_association
。但是,如果我为少数协会创建一个元素,我仍然有有效的记录。
taskable = Taskable.create(taskable_params)
taskable.supplies << Supply.create(supply_params)
taskable.deliveries << Delivery.create(delivery_params)
taskable.reload
taskable.supplies.count # => 1
taskable.deliveries.count # => 1
taskable.valid? # => true (should be false)
似乎activerecord在某处缓存这些方法。我怎样才能避免这种不可预测的行为?
答案 0 :(得分:1)
这个查询似乎有问题:
unless [deliveries, packages, supplies].count(:any?) <= 1
也许它应该有&amp;?
unless [deliveries, packages, supplies].count(&:any?) <= 1
在我的控制台中工作。