2011-12-08 78 views
2

問題我有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和積極的舊值執行。 爲什麼?

我該怎麼辦用新值的驗證?

+0

爲了給出一個更可信的答案我們需要在那裏你閱讀的對象以及您對其進行更改(我覺得弗雷德裏克祥是在代碼示例這裏正確的軌道) – LucaM

回答

3

問題是,默認情況下,一對has_manybelongs_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 

一天軌將有一個標識映射應該使這種東西更不容易出錯(它是在導軌3.1,因爲微妙相關的錯誤,但禁用,如果我沒記錯的話)

-1

也許你正在通過另一個Ruby對象中修改的產物。該變體引用的產品仍保留舊值。我不知道這是你在做什麼,但可能是這樣。

一個解決辦法是驗證之前重新加載該產品。

class Variant 
    before_validation do 
    self.product.reload 
    end 
end 
0

你可能需要做什麼@thoferon是在暗示(假設你是不是做以嵌套屬性的產品或某事),或確保產品的所有變化都是通過關聯對象發生所以它是-至今。