Динамические искатели возвращают новый объект, отличный от любого в коллекции has_many? - PullRequest
0 голосов
/ 20 марта 2012

Я пытаюсь найти объект из коллекции has_many средствами динамического поиска, а затем обновить атрибут возвращаемого объекта. Но я действительно не знаю, когда обновленное значение атрибута будет синхронизировано с коллекцией has_many. Потому что я обнаружил, что возвращаемый объект - это новый объект, отличный от любого из объектов в коллекции has_many.

class Cart < ActiveRecord::Base
  has_many :line_items, :dependent => destroy

  def add_product(product_id)
    current_item = line_items.find_by_product_id(product_id) 
    #here current_item is #<LineItem:0x007fb1992259c8>
    #but the line_item in has_many collection line_items is #<LineItem:0x007fb19921ed58>
    if current_item
      current_item.quantity += 1
    else
      current_item = line_items.build(:product_id => product_id)
    end
    current_item
  end
...
end

class LineItemsController < ApplicationController
  ...
  def create
    @cart = current_cart
    product = Product.find(params[:product_id])
    @line_item = @cart.add_product(product_id)

    respond_to do |format|
      if @line_item.save
        format.js { @current_item = @line_item }
      end
    end
  end
  ...
end

После обновления количества current_item, при рендеринге Cart, количество line_item в корзине все равно будет значением до обновления. Но, тем не менее, в следующий раз при вызове LineItemsController.create количество line_item в корзине было обновлено. Так есть ли идеи о том, когда количество line_item в корзине было обновлено?

1 Ответ

0 голосов
/ 20 марта 2012

Самое простое решение - позвонить по номеру cart.line_items(true) после того, как вы обновили отдельную позицию. Это заставляет Rails перезагружать всю связь из базы данных, которая должна включать изменения в количестве позиций.

Вы также можете использовать detect вместо find_by_product_id для извлечения позиции непосредственно из массива позиций. Это гарантирует, что вы используете один и тот же объект, но для этого требуется сначала загрузить все позиции из базы данных (что звучит так, как будто вы уже делаете):

current_item = line_items.detect { |item| item.product_id == product_id }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...