3

我再問this question,因爲代碼和示例是錯誤的(它實際上在所示情況下工作)。Rails的ActiveRecord:跳過驗證的協會

鑑於這些機型:

class Author < ActiveRecord::Base 
    has_many :books 
    validates_presence_of :email 
end 

class Book < ActiveRecord::Base 
    belongs_to :author 
    validates_presence_of :title 
end 

創建一本書時,我們可以跳過驗證:

b = Book.new 
b.save(:validate => false) 

但是,如果我們從數據庫中檢索無效的書籍,並在作者指定的關聯,我們不允許保存作者:

a = Author.new 
a.email = "foo" 
a.books = Book.all 
a.save! 

這是錯誤:

ActiveRecord::RecordInvalid: Validation failed: Books is invalid

我們如何跳過相關書籍模型的驗證而不跳過作者?

請注意,在作者說has_many :books, :validate => false沒有幫助:關聯被默默丟棄與作者保存。

回答

11

試一下

class Author < ActiveRecord::Base 
    has_many :books, :validate => false 
    validates_presence_of :email 
    after_save :save_invalid_books 

    def save_invalid_books 
    books.each do |b| 
     b.save(false) 
    end 
    end 
end 

據我瞭解,在驗證=>虛假只允許你保存作者沒有由無效的書被停止,但爲了節省您需要一個有效的書,你的關聯將更改author_id密鑰。 您無法更改rails內部結構,但您仍然可以通過保存作者而無需驗證,然後更新每本書並立即強制保存(使用save(false))來欺騙它。

當然,這個代碼可以在很多方面得到增強,因爲可能沒有必要每次開始時都保存所有的圖書,但是你明白了。

+0

謝謝!你的代碼有效。我忽略了關聯正在更新外鍵(因此模型需要有效)。 – 2010-12-16 00:51:29