我有2个模特
class Variant < ActiveRecord::Base
belongs_to :product
with_options :if => :is_active? do |p_active|
p_active.validates :avatar, :presence => true
end
with_options :if => :isnt_diavoleria? do |p_active|
p_active.validates :color, :presence => true
end
def is_active?
self.product.active
end
def isnt_diavoleria?
a = (self.is_active? and self.product.section_id != 5)
a
end
end
class Product < ActiveRecord::Base
has_many :variants, :autosave => true
accepts_nested_attributes_for :variants
end
如果我更改属性section_id或产品的活动并保存,则使用旧的section_id和active值执行模型变体的验证。 为什么呢?
如何使用新值进行验证?
答案 0 :(得分:3)
问题是默认情况下,一对has_many
和belongs_to
关联不知道它们是彼此相反的。所以,当你
product.section_id = 23
product.save
然后在你的验证中,变体
self.product
并实际上再次从数据库中提取,显然没有未保存的更改。
您应该可以通过向关联添加:inverse_of
标志来解决此问题,即
class Variant < AR::Base
belongs_to :product, :inverse_of => :variants
end
class Product < AR::Base
has_many :variants, :inverse_of => :products
end
有一天rails会有一个身份映射,它应该使这类东西不易出错(它在rails 3.1中但由于我记得正确的话会因为微妙的相关错误而被禁用)
答案 1 :(得分:0)
您可能需要执行@thoferon建议的操作(假设您没有为产品或其他东西执行嵌套属性)或确保通过关联对象对产品进行所有更改,以使其保持最新状态
答案 2 :(得分:-1)
也许您正在通过另一个Ruby对象修改产品。变体引用的产品仍然保留旧值。我不知道这是你正在做的事情,但情况可能就是这样。
解决方案可能是在验证前重新加载产品。
class Variant
before_validation do
self.product.reload
end
end