[英]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子记录。
陷阱:
如果您选择这种级联保存方法,请确保您添加了validates_associated来进行belongs_to记录,否则可能会导致数据库不一致,因为validates :search_term, presence: true
可以通过,即使SearchTerm本身无效。 我已经将validates_associated
添加到SearchTermOccurrence。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.