【问题标题】:rails can't count association on validationrails 不能在验证时计算关联
【发布时间】: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


【解决方案1】:

这个查询似乎有问题:

unless [deliveries, packages, supplies].count(:any?) <= 1

也许它应该有&?

unless [deliveries, packages, supplies].count(&:any?) <= 1

在我的控制台中工作。

【讨论】:

  • 天啊!这只是一个错字。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
相关资源
最近更新 更多