Rails验证使用accepts_nested_attributes_for接收值的模型

时间:2015-11-10 12:50:42

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有2个型号:Dealer& Location

class Dealer < AR::Base
  has_many :locations

  accepts_nested_attributes_for :locations

  validate :should_has_one_default_location

  private

  def should_has_one_default_location
    if locations.where(default: true).count != 0
      errors.add(:base, "Should has exactly one default location")
    end
  end
end

class Location < AR::Base
  # boolean attribute :default
  belongs_to :dealer
end

如您所知,should_has_one_location每次都会添加错误,因为.where(default: true)会进行SQL查询。我该如何避免这种行为?

非常脏的解决方案是使用inverse_ofselect的组合而不是在哪里,但它看起来非常脏。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我实际上得到了一个类似我自己问题的答案。无论它有什么价值,如果您想进行上述验证(但没有数据库查询),您可以执行以下操作:

errors.add(:base, ""Should have exactly one default location") unless locations.any?{|location| location.default == 'true'}