我重新询问 this question 因为代码和示例是错误的(它实际上在所示的情况下有效)。
鉴于这些模型:
class Author < ActiveRecord::Base
has_many :books
validates_presence_of :email
end
class Book < ActiveRecord::Base
belongs_to :author
validates_presence_of :title
end
我们可以在创建 Book 时跳过验证:
b = Book.new
b.save(:validate => false)
但是如果我们从数据库中检索到无效的 Book 并将其分配给 Author 中的关联,则不允许保存 Author:
a = Author.new
a.email = "foo"
a.books = Book.all
a.save!
这是错误:
ActiveRecord::RecordInvalid: Validation failed: Books is invalid
我们如何跳过关联 Book 模型的验证而不跳过 Author 的验证?
请注意,在 Author 中说
has_many :books, :validate => false
没有帮助:关联被悄悄丢弃,而 Author 已保存。
最佳答案
试试看
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
据我了解,validate => false 只允许您保存作者而不会被无效书籍阻止,但要保存关联,您需要一本有效书籍,因为您将更改 author_id 键。
您无法更改 rails 内部结构,但您仍然可以通过在未经验证的情况下保存作者,然后更新每本书并在之后立即强制保存(使用 save(false))来欺骗它。
当然,可以通过多种方式增强此代码,因为可能没有必要每次都保存所有书籍以开始使用,但您明白了。
关于ruby-on-rails - Rails ActiveRecord : Skip validations for associations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4393885/