2012-10-19 7 views
3

J'ai deux applications, App1 et App2. App1 poste une charge utile JSON à App2 qui inclut des données pour un objet parent et enfant. Si l'objet parent existe déjà dans App2, nous mettons à jour l'enregistrement parent si quelque chose a changé et créons l'enregistrement enfant dans App2. Si l'objet parent n'existe pas dans App2, nous devons d'abord le créer, puis créer l'objet enfant et associer les deux. En ce moment je le fais comme ceci:Quelle est la meilleure façon de créer un objet parent et enfant dans un POST?

class ChildController 
    def create 
    @child = Child.find_or_initialize_by_some_id(params[:child][:some_id]) 
    @child.parent = Parent.create_or_update(params[:parent]) 

    if @child.update_attributes(params[:child]) 
     do_something 
    else 
     render :json => @child.errors, :status => 500 
    end 
    end 
end 

Quelque chose semble sale de créer/mettre à jour le parent comme ça. Y a-t-il une meilleure façon de s'y prendre? Merci!

Répondre

3

En tant que point de départ, vous aurez envie de créer l'association dans votre modèle, puis inclure accepts_nested_attributes_for sur votre parent. Avec les associations créées dans votre modèle, vous devriez être en mesure de manipuler la relation assez facilement, car vous obtenez automatiquement un ensemble de méthodes destinées à gérer la relation. Par exemple, votre parent/enfant modèle pourrait ressembler à ceci:

Dans votre modèle parent:

class Parent < ActiveRecord::Base 
    has_many :children 
    accepts_nested_attributes_for :children 

Dans votre modèle d'enfant:

class Child < ActiveRecord::Base 
    belongs_to :parent 

Ensuite, vous devriez être en mesure de construire associations dans votre contrôleur comme ceci:

def new 
    @parent = Parent.children.build 
end 

def create 
    @parent = Parent.children.build(params[:parent]) 
end 

La propriété nested_attributes permettra alors vous pour mettre à jour les attributs de l'enfant en manipulant le parent. Voici l'API Rails sur le sujet: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Questions connexes