2016-09-05 128 views
0

我遇到了以這種方式創建自動對象的麻煩。請考慮以下型號:Rails 4級聯保存與驗證在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處理事務邏輯。

+0

'belongs_to'關聯默認有一個存在驗證 - 您不需要添加一個 – ArtOfCode

+0

這是不正確的。我仍然可以在不使用SearchTerm的情況下自行保存SearchTermOccurrence。 –

回答

0

所以玩一些使用Rails控制檯後,我找到了答案。問題在於保存的順序。 (SearchTerm has_many - > SearchTermOccurrences)我試着從下往上保存它(SearchTermOccurrence belongs_to - > SearchTerm)。我選擇了不同的保存方法:SearchTerm has_many - > SearchTermOccurrences)我試着從下往上保存它(SearchTermOccurrence belongs_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只能在新創建時驗證belongs_to關聯中的父記錄,但不能驗證has_many子記錄。

編輯1

陷阱:

如果你選擇這種級聯保存方法,請確保您添加validates_associated爲belongs_to的記錄,否則,你可能最終與數據庫不一致,因爲validates :search_term, presence: true可以通過即使SEARCHTERM本身是無效的。我已將validates_associated添加到SearchTermOccurrence。

0

在將SearchTermOccurrence對象添加到其中之前,應先保存term實例。

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

因爲SearchTermOccurrence有它驗證的父SearchTerm目前真正使SearchTerm.new不會創建任何SearchTerm ID寫入數據庫,直到它被保存。

試試上面的代碼

+0

這不是我想要的。我希望Rails處理數據庫事務和自動保存。我不想如上所述顯式保存所有對象。 –

+0

那麼我相信你應該去自動保存關聯選項。看到這裏的文檔[鏈接](http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html) – Kushal

+0

你可以給我舉例說明如何設置它?因爲最後一次嘗試時它不適合我。如果我添加自動保存:對我的has_many關聯,它仍然不起作用。 –