Ruby on rails 3 验证问题

Ruby on rails 3 验证问题,ruby-on-rails-3,validation,Ruby On Rails 3,Validation,我有两种型号 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

我有两种型号

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
类变量:_处于活动状态吗?do | p|u活动|
p_active.validates:avatar,:presence=>true
结束
带选项:if=>:不是吗?do | p|u活动|
p_active.validates:color,:presence=>true
结束
def是否处于活动状态?
自我产品
结束
迪夫不是迪亚沃里亚吗?
a=(self.is_active?和self.product.section_id!=5)
A.
结束
结束
类产品true
接受:变体的\u嵌套\u属性\u
结束
如果我更改了产品的属性section_id或active并保存,则使用section_id和active的旧值执行模型变量的验证。 为什么?


如何使用新值进行验证?

可能您正在通过另一个Ruby对象修改产品。变体引用的产品仍保留旧值。我不知道这是否是你正在做的,但可能是这样

解决方案可能是在验证前重新加载产品

class Variant
  before_validation do
    self.product.reload
  end
end

您可能需要执行@thoferon的建议(假设您没有为产品或其他东西使用嵌套属性)或者确保产品的所有更改都是通过关联对象进行的,因此它是最新的。

问题是,默认情况下,一对
有许多
,而
所属的
关联不知道它们是彼此的反向。所以当你

product.section_id = 23
product.save
然后,在验证过程中,变量

self.product
实际上再次从数据库中获取,显然没有未保存的更改

您应该能够通过将
:reverse\u of
标志添加到您的关联中来解决此问题,即

class Variant < AR::Base
  belongs_to :product, :inverse_of => :variants
end
class Product < AR::Base
  has_many :variants, :inverse_of => :products
end
类变量:variants 结束 类产品:产品 结束

总有一天rails会有一个身份映射,它会使这类东西不那么容易出错(rails 3.1中有此功能,但如果我没记错的话,它会被禁用)

为了给出一个更可信的答案,我们需要一个代码示例,在其中读取对象并在哪里更改它们(我认为张鉴泉在这方面是正确的)