В Mongoid, вы можете атомарно уничтожить внедренный документ и обновить его родитель? - PullRequest
2 голосов
/ 30 апреля 2011
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

Я бы хотел, чтобы remove_item атомарно удалил товар из корзины и установил несколько новых цен в одной update для коллекции тележек.

Возможно ли это?Может быть, какой-нибудь API, чтобы пометить вложенный элемент для уничтожения и затем сохранить корзину?

Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2011

Это возможно, сэр.Секрет в 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

В представлении:

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

С этим вы можете удалять товары из корзины, обновлять количество и пересчитывать цены в одной корзине update.

...