Rails数据库调用(.save / .destroy)

时间:2012-04-27 04:15:48

标签: ruby-on-rails

我在浏览Agile Web Development with Rails时遇到了一个简短的问题,我在浏览网站时无法找到答案。我有两种方法:

此方法在我的控制器中:

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作为变量仍然存在,只是数据库对象被破坏了吗?控制器中的减量方法如何保存已被破坏的对象? (我在控制器方法的if语句中放了一个logger.debut语句,无论模型方法是否评估if或else语句,似乎代码总是在那里进行。)

1 个答案:

答案 0 :(得分: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