【发布时间】:2015-06-22 10:43:14
【问题描述】:
假设我有一个这样的模型:
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 将这些方法缓存在某处。如何避免这种不可预测的行为?
【问题讨论】:
-
如果你在控制台运行脚本,你能看到 Rails 尝试查询数据库来检查你的关系的
any?吗? -
不,它不发送任何东西
标签: ruby-on-rails ruby activerecord rails-activerecord