2016-04-25 14 views
1

ネストされた属性を扱うためにJSONの投稿を取得しました。子モデルでJSONレコードを投稿することはできません。特定のフィールド名でネストされた属性をレンダリングする

しかし、レコードを更新すると、アップロードプログラムはモデルのレールIDを知らないため、「tracking_id」というフィールドを検索します。その片方向のアップロードとそれに不可抗力のままです。このフィールドを使用して、私は正しいレコードを見つけて更新を投稿することができます。しかし、更新された代わりに子が挿入されます。

クライアントアプリケーションはそれが何であるか分からないので、定義したフィールドに基づいて子どもを見つける方法を教えてもらえますか?

例:私が好きな何

#in Event Model 
def self.batch_create(post_content, keymaster) 
    #keymaster is the user so we can add events to the right place 

    # begin exception handling 
    begin 
    # begin a transaction on the event model 
    Event.transaction do 
     # for each event record in the passed json 
     JSON.parse(post_content).each do |event_hash| 
     # create a new event 
     # if hash has tracking_id use that 
     if event_hash["tracking_id"].present? 
      event = keymaster.events.where(tracking_id: event_hash["tracking_id"]).first_or_initialize 
     else 
      event = keymaster.events.new 
     end 

     if event 
      # update the existing event record 
      event.update!(event_hash) 
     end # event.count 
     end # json.parse 
    end # transaction 
    rescue Exception => e 
    Rails.logger.info("Did not create batch events") 
    Rails.logger.info("caught exception #{e}! ohnoes!") 
    # Rails.logger.info(post_content)  
    end # exception handling 
end # batch_create 

はイベントレコードの子どもたちのために同じ機能です。イベントに既に参加している場合は、新しい行を挿入するだけでなく、イベントを更新します。

+0

コントローラが子モデルを見つけるためにどのようなパラメータフィールドを定義しますか?できればparams/controllerからいくつかのサンプルコードを提供できますか? –

+0

詳細情報を追加 –

答えて

1

一つの可能​​性は、ネストされたのparamsをループしていると、既存のnested_attributeを確認するために使用するレールidフィールド注入:あなたのparamsが構築されている正確にどのように

わからないが、しかし、ここで擬似コードです:

For each event hash in `events_attributes` nested attributes: 
    Find event by whatever attributes you've defined in your hash 
    Inject `id` of found event into the attributes hash 

ネストされたフィールドにidフィールドがあるので、Railsは新しいレコードを作成するのではなく、既存のレコード(つまりupsert)を更新します。

+0

ああ、私はこれで動作すると思う。 –

関連する問題