gpt4 book ai didi

ruby-on-rails - Rails ActiveRecord : Skip validations for associations

转载 作者:行者123 更新时间:2023-12-04 22:16:23 29 4
gpt4 key购买 nike

我重新询问 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com