2011-04-30 4 views
2
class Cart 
    include Mongoid::Document 
    embeds_many :cart_items 

    def calculate_prices 
    # Set some fields 
    end 

    def remove_item(item) 
    # what goes here? 
    calculate_prices 
    save 
    end 
end 

class CartItem 
    include Mongoid::Document 
    embedded_in :cart 
end 

Je voudrais que le remove_item enlève de manière atomique l'article du panier du panier et fixe de nouveaux prix dans un update à la collection de chariots.Dans Mongoid, pouvez-vous détruire de manière atomique un document incorporé et mettre à jour son parent?

Est-ce possible? Peut-être que certaines API pour marquer un élément intégré pour détruire et ensuite enregistrer le panier?

Merci!

+0

Avez-vous trouvé cette solution? – index

+0

Non. Peut-être ajouter un problème de github pour cela? :( – Ben

+0

Je vois, nous devrions peut-être, ou pourrions-nous nous attaquer incorrectement? – index

Répondre

0

C'est possible, monsieur. Le secret est dans accepts_nested_attributes_for:

class Cart 
    include Mongoid::Document 
    embeds_many :cart_items 

    attr_accessible ... 

    accepts_nested_attributes_for :cart_items 
    attr_accessible :cart_items_attributes 

    set_callback(:update, :before) do |document| 
    document.calculate_prices 
    end 

    protected 

    def calculate_prices 
    # Set some fields 
    end 

end 

class CartItem 
    include Mongoid::Document 
    embedded_in :cart 

    attr_accessible ... 
end 

De l'avis:

= form_for @cart do |f| 
    = f.fields_for :cart_items do |n| 
    = render "cart_item", :n => n, :cart_item => n.object 

Avec que vous pouvez supprimer des éléments du panier, les quantités de mise à jour et recalcule les prix dans un seul panier update.

+0

Et si je n'avais pas besoin d'attributs imbriqués/je ne pouvais pas utiliser/je ne pouvais pas utiliser les attributs imbriqués? (En regardant le code (https://github.com/ mongoid/mongoid/blob/master/lib/mongoid/relations/constructeurs/nested_attributes/many.rb # L117), je ne vois pas comment c'est différent de simplement appeler #destroy? – Ben

+0

@Ben: Il s'agit de documents référencés. les documents sont mis à jour atomiquement avec le parent. 'accepts_nested_attributes_for' est ici pour plus de commodité dans le formulaire. – Voldy

Questions connexes