2012-04-27 2 views
0

У меня был быстрый вопрос, идя в то время, когда вы проходили через Agile Web Development с Rails, что я не смог найти ответ, просматривая веб-сайт. У меня есть два метода:Rails database calls (.save/.destroy)

Этот метод в моем контроллере:

def decrement 
    @line_item = LineItem.find(params[:id]) 
    @line_item = @line_item.decrement_quantity(@line_item.id) 

    respond_to do |format| 
    if @line_item.save 
     format.html { redirect_to store_url } 
     format.json { render json: @line_item, status: :created, location: @line_item } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @line_item.errors, status: :unprocessable_entity } 
    end 
    end 

И это в соответствующей модели:

def decrement_quantity(line_item_id) 
    current_item = LineItem.find_by_id(line_item_id) 

    if current_item.quantity > 1 
    current_item.quantity -= 1 
    else 
    current_item.destroy 
    end 

    current_item 
end 

Я знаю, что это не самый эффективный код, но мой вопрос в том, что current_item будет уничтожен в методе модели, то, что возвращает этот метод? (nil?) Является ли current_item как переменная все еще существующей, только объект базы данных был уничтожен? Как метод декремента в контроллере может сохранить объект, который был уничтожен? (Я поставил оператор logger.debut в инструкции if метода контроллера, и кажется, что код всегда проходит там независимо от того, оценил ли метод модели оператор if или else).

ответ

0

Модель все еще существует на время вызова, но она удалена из базы данных, и если вы вызываете current_item.destroyed?, тогда она вернет true.

Даже если объект был разрушен, метод save возвращает true.

Вот некоторые выводы терминала, которые, надеюсь, помогут.

1.9.2p290 :001 > current_item = Deck.first 
    Deck Load (0.1ms) SELECT "decks".* FROM "decks" LIMIT 1 
=> #<Deck id: 2, name: "Test Deck 1", description: "This is a te> #snip 
1.9.2p290 :002 > current_item.destroyed? 
=> false 
1.9.2p290 :003 > current_item.destroy 
    (0.2ms) begin transaction 
    SQL (23.1ms) DELETE FROM "decks" WHERE "decks"."id" = ? [["id", 2]] 
    (5.0ms) commit transaction 
=> #<Deck id: 2, name: "Test Deck 1", description: "This is a te> #snip 
1.9.2p290 :004 > current_item.destroyed? 
=> true 
1.9.2p290 :005 > current_item.save 
    (0.2ms) begin transaction 
    (0.1ms) commit transaction 
=> true 
+0

Большое спасибо - быстрый вопрос о последующих действиях, если предмет был уничтожен, а что (если что-либо) является командой line_item.save? (не кажется, что есть что-то, что можно сэкономить). – Alex

+0

Вы можете следить за цепочкой вызовов методов, начиная с http://apidock.com/rails/ActiveRecord/Transactions/save, чтобы определить ответ. – Gazler

+0

Получил это - Большое спасибо за вашу помощь Gazler. – Alex

Смежные вопросы