2013-05-25 2 views
0

Dans un contexte de modèles imbriqués et de champs de formulaire, lors de la création du parent et de la valeur d'un enfant, l'objectif est d'appliquer une condition à la valeur de l'enfant pour déterminer une valeur subséquente (product_id), le tout dans la création d'une action mèreattribut de mise à jour après création de la condition suivante appliquée à un autre attribut

class QuoteItem < ActiveRecord::Base 
    belongs_to :quote, :inverse_of => :quote_items 
    belongs_to :product 

class Quote < ActiveRecord::Base 
    has_many :quote_items, :inverse_of => :quote 

Cela ne peut pas être exécuté en tant que méthode de modèle au préalable, comme le modèle n'a aucune idée de params. Une tentative de définir un rappel after_create pour QuoteItem

after_create :set_product 
    def set_product 
    @quote_item.product_id = Product.where(['min <= ? AND max >= ?', @quote_item.size, @quote_item.size]).first.select[:id]  
    end 

ne pas enregistrer l'identifiant du produit.

Une manière plus succincte pourrait être de recharger les données via le contrôleur. Sur l'action créer

respond_to do |format| 
     if @quote_item.save 
     set_product 
     @quote_item.update_attribute([:quote_item][:product_id]) 
     format.html { redirect_to @quote_item, notice: 'Quote item was successfully created.' } 

avec un résultat NIL identique

+0

action faite dans 'after_create' ne sont pas persisté – Ven

+0

OK. Le travail avant la sauvegarde et après la commande create est toujours ignoré: ----- def create bim = Product.where (['min <=? ET max> =?', Params [: quote_item] [: size ], params [: quote_item] [: size]]). premier params [: quote_item] [: size] = bim @quote_item = QuoteItem.new (params [: quote_item]) – Jerome

Répondre

1

La solution est en fait possible after_create. Dans le modèle imbriqué, mettre à jour les attributs créer après

after_create :set_product 

private 

    def set_product 
    product_id = Product.where(['min <= ? AND max >= ?', self.size, self.size]).first.id 
    update_attributes(:product_id => product_id) 
    end 
Questions connexes