2016-04-25 16 views
1

Ich habe meine JSON-Posting mit verschachtelten Attributen arbeiten. Ich kann keine JSON-Datensätze mit den Kindermodellen posten und es wird gut gepostet.Rails verschachtelte Attribute nach spezifischen Feldnamen

Wenn ich jedoch einen Datensatz aktualisiere, suche ich nach einem Feld namens "tracking_id", weil das Upload-Programm die Rails-ID für das Modell nicht kennt. Es ist ein One-Way-Upload und bleibt agnostisch. Mit diesem Feld kann ich den korrekten Datensatz finden und ein Update veröffentlichen. Jedoch werden die Kinder dazu eingefügt statt aktualisiert.

Gibt es eine Möglichkeit, ich kann es sagen, um Kinder basierend auf einem Feld zu finden, die ich definiere, nicht nur "ID", da die Client-Anwendung nicht wissen, was das ist?

Beispiel:

#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 

Was ich möchte, ist die gleiche Funktion für die Kinder des Ereignisdatensatzes. Wenn sie bereits auf der Veranstaltung sind, werden sie aktualisiert und nicht nur neue Zeilen eingefügt.

+0

Welche Parameterfelder würden Sie für den Controller definieren, um untergeordnete Modelle zu finden? Können Sie einen Beispielcode bereitstellen, vorzugsweise von Ihrem Paramter/Controller? –

+0

hat weitere Informationen hinzugefügt –

Antwort

1

Eine Möglichkeit ist, eine Schleife durch die verschachtelten params und injiziert das id Feld, das für eine bestehende nested_attribute Radlenker verwendet:

Nicht sicher, wie Ihr params aufgebaut ist, aber hier ist der Pseudo-Code:

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 

Jetzt, da Sie ein Feld id in Ihrem verschachtelten haben, wird Rails den vorhandenen Datensatz (dh Upsert) aktualisieren, anstatt einen neuen Datensatz zu erstellen.

+0

ah ja, ich denke ich kann damit arbeiten. –

Verwandte Themen