加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails ActiveRecord:跳过关联的验证

发布时间:2020-12-17 01:44:41 所属栏目:百科 来源:网络整理
导读:我正在重新询问 this question,因为代码和示例是错误的(它实际上适用于所示的情况). 鉴于这些模型: class Author ActiveRecord::Base has_many :books validates_presence_of :emailendclass Book ActiveRecord::Base belongs_to :author validates_presenc
我正在重新询问 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

我们可以在创建图书时跳过验证:

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

我们如何跳过相关图书模型的验证而不为作者跳过它们?

请注意,说has_many:books,:validate =>作者中的false没有帮助:在保存作者的情况下静默丢弃关联.

解决方法

试试吧

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)).

当然,这段代码可以通过多种方式得到增强,因为每次开始时可能没有必要保存所有书籍,但是你明白了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读