2016-09-05 8 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の検証を省略します。すべてが適切に保存されます。

私の質問は、関連付けられたオブジェクトを1つずつ保存せずに子オブジェクトの検証を行っている間に、親オブジェクトとその関連付け(新しく作成)を保存してから、トランザクション内に親オブジェクトを保存する方法です。 Railsにトランザクションロジックを処理させたい。

+0

'belongs_to'の関連付けには、デフォルトでプレゼンス検証が付属しています。追加する必要はありません – ArtOfCode

+0

これは当てはまりません。私はまだSearchTermを持たずにSearchTermOccurrenceを独自に保存することができます。 –

答えて

0

上記

試してみるので、Railsのコンソールでいくつか演奏した後、私は答えを見つけました。問題は節約の順序だった。

私は別々の保存方法を選択しました。上から下に行くのではなく(SearchTerm has_many - > SearchTermOccurrences)、下から上に保存しようとしました(SearchTermOccurrence belongs_to - > SearchTerm)。だから、代わりにこれを行う:これは突然働い

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

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

私はこれをしませんでした。だから私は、Railsは新たに作成されたが、has_manyの子レコードを検証することはできませんが、belongs_to関連付けの親レコードのみを検証できると推測しています。

EDIT 1つの

落とし穴:

あなたは必ずvalidates :search_term, presence: trueもSEARCHTERM自体かかわら渡すことができますので、それ以外の場合は、あなたが、一貫性のないデータベースで終わるかもしれないbelongs_toのレコードのvalidates_associated追加行い、アプローチを保存し、このカスケードを選択している場合無効です。 SearchTermOccurrenceにvalidates_associatedを追加しました。

0

オブジェクトを追加する前に、termインスタンスを保存しておく必要があります。 SearchTermOccurrenceはそれの検証を持って

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

ので親SearchTermだ現在、それが保存されるまでそうSearchTerm.newがデータベースにSearchTermのいずれかのIDを作成しません真。コード

+0

それは私が欲しいものではありません。 RailsにDBトランザクションと自動保存を処理させたい。私は上記のようにすべてのオブジェクトを明示的に保存したくありません。 –

+0

私はあなたが自動保存関連オプションのために行くべきだと信じています。ここのドキュメントを参照してください[link](http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html) – Kushal

+0

設定方法の例を教えてください。私が最後に試した時、それは私にとってはうまくいかなかったからです。私がautosave:をhas_manyアソシエーションに追加すると、それはまだ動作しません。 –

関連する問題