繁体   English   中英

Rails 4级联保存关联与归属验证

[英]Rails 4 cascade save association with validation on belongs_to

我在自动保存以这种方式创建的对象时遇到了麻烦。 考虑使用以下模型:

class SearchTerm < ActiveRecord::Base
   has_many :search_term_occurrences, dependent: :destroy
end

class SearchTermOccurrence < ActiveRecord::Base
   belongs_to :search_term
   validates :search_term, presence: true # Problematic validation
   validates_associated :search_term # See Gotchas in answer
end

因此,当我尝试执行以下操作时:

term = SearchTerm.new term: 'something'
term.search_term_occurrences << [SearchTermOccurrence.new, SearchTermOccurrence.new]
term.save!

我得到以下内容:

ActiveRecord::RecordInvalid: Validation failed: Search term occurrences is invalid, Search term occurrences is invalid

但是,当我省略对belongs_to search_term的验证时。 一切都保存正确。

我的问题是:如何在对子对象进行验证的同时保存父对象及其关联(新创建),而不一一保存关联对象,然后在事务内保存父对象? 我希望Rails处理事务逻辑。

您应先保存term实例,然后再将SearchTermOccurrence对象添加到其中。

term = SearchTerm.new term: 'something' term.save! term.search_term_occurrences << [SearchTermOccurrence.new, SearchTermOccurrence.new]

因为SearchTermOccurrence的父SearchTerm验证为true,所以SearchTerm.new在保存之前不会在数据库中创建任何SearchTerm ID。

试试上面的代码

因此,在使用Rails控制台后,我找到了答案。 问题是保存顺序。

我选择了不同的保存方法:而不是从上到下(SearchTerm has_many-> SearchTermOccurrences),而是尝试从下往上保存它(SearchTermOccurrence Emirates_to-> SearchTerm)。 所以不要这样做:

term = SearchTerm.new term: 'something'
term.search_term_occurrences << [SearchTermOccurrence.new, SearchTermOccurrence.new]
term.save!

我这样做:

occurrence = SearchTermOccurrence.new
occurence.search_term = SearchTerm.new(term: 'search query')
occurence.save!

这突然起作用了。 因此,我猜想Rails只能在新创建的同时验证属植物关联中的父记录,而不能验证has_many子记录。

编辑1

陷阱:

如果您选择这种级联保存方法,请确保您添加了validates_associated来进行belongs_to记录,否则可能会导致数据库不一致,因为validates :search_term, presence: true可以通过,即使SearchTerm本身无效。 我已经将validates_associated添加到SearchTermOccurrence。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM