我有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_of
和select
的组合而不是在哪里,但它看起来非常脏。有什么想法吗?
答案 0 :(得分:0)
我实际上得到了一个类似我自己问题的答案。无论它有什么价值,如果您想进行上述验证(但没有数据库查询),您可以执行以下操作:
errors.add(:base, ""Should have exactly one default location") unless locations.any?{|location| location.default == 'true'}