2013-05-29 3 views
0

J'ai une application rails avec les modèles suivants:Créer nouvel objet avec des relations sans l'id lié

class Product < ActiveRecord::Base 
    has_many :stores, through: :product_store 

    attr_accessible :name, :global_uuid 
end 

class ProductStore < ActiveRecord::Base 
    attr_accessible :deleted, :product_id, :store_id, :global_uuid 

    belongs_to :product 
    belongs_to :store 
end 

Ce modèle est une API REST d'une application mobile, je crée les objets à distance, sur la périphériques, puis synchroniser avec ce modèle. Comme cela se produit, il peut arriver que je dois créer un ProductStore avant d'avoir un id ensemble pour Product. Je sais que je pourrais regrouper les demandes d'API et trouver une solution de contournement, mais j'ai décidé d'avoir un attribut global_uuid qui est créé dans l'application mobile et synchronisé.

Ce que je voudrais savoir comment puis-je faire ce code dans mon contrôleur:

def create 
    @product_store = ProductStore.new(params[:product_store]) 
    ... 
end 

sachez qu'il va recevoir un paramètre product_global_uuid au lieu d'un paramètre product_id et avoir remplir correctement la modèle.

Je me dis que je peux passer outre ProductStore#new mais je ne sais pas s'il y a une ramification lorsque vous faites cela.

Répondre

1

Redéfinition .new est une entreprise dangereuse, vous ne voulez pas participer à le faire. Je voudrais juste aller avec:

class ProductStore < ActiveRecord::Base 
    attr_accessible :product_global_uuid 
    attr_accessor :product_global_uuid 

    belongs_to :product 
    before_validation :attach_product_using_global_uuid, on: :create 

    private 
    def attach_product_using_global_uuid 
    self.product = Product.find_by_global_uuid! @product_global_uuid 
    end 

end 

Avoir ce genre de artificielle attr_accessors qui ne sont utilisés dans la création de modèle est une sorte de désordre, et que vous voulez éviter de passer dans tout ce qui est pas un attribut direct du modèle que vous créent si possible. Mais comme vous le dites, il y a différentes considérations à équilibrer, et ce n'est pas la pire chose au monde.

+0

me semble bon. Je suis d'accord sur les accesseurs, mais il faut être pragmatique et avoir besoin de les synchroniser correctement, ce qui est plus important sur ce projet. – pgb

Questions connexes