如何使用回调更新另一个模型?

时间:2011-01-07 01:13:48

标签: ruby-on-rails callback

我正在使用名为Recover的模型。在创建模型之前,我想使用Recover.combo_id属性作为参考来保存布尔属性Combo.occupied = true。

看来我的SQL正在正确执行查询,但它没有保存此属性。如何保存Combo.occupied = true?

recover.rb:

  

before_create:checkin

     

保护

     def checkin         x = Combo.find_by_id(combo_id).occupied =   真正
  端

Rails控制台:

  

为127.0.0.1开始POST“/恢复”   在2011-01-06 17:07:24 -0800
  处理方式   RecoversController#创建为HTML
  参数:{“utf8”=>“✓”,   “authenticity_token”=> “中o1Iu3Y9 / rVBOZPoDUgVP / tRfQ8GxbdWC40DbPq9YxUE =”,   “恢复”=> { “combo_id”=> “中4”,   “电子邮件”=> “中jz@marin.edu”},   “commit”=>“创建恢复”}恢复   加载(0.2ms)SELECT“恢复”。“id”   从“恢复”WHERE   (“恢复”。“电子邮件”=   'justin.zollars@marin.edu')限制1
  恢复负载(0.1ms)SELECT   “恢复”。“id”FROM“恢复”在哪里   (“恢复”。“combo_id”= 4)限制1
  组合负载(0.5ms)SELECT“组合”。*   FROM“combos”WHERE(“combos”。“id”=   4)LIMIT 1 AREL(0.5ms)INSERT INTO   “恢复”(“locker_number”,“电子邮件”,   “requests”,“created_at”,   “updated_at”,“combo_id”)价值观   (NULL,'justin.zollars@marin.edu',   NULL,'2011-01-07 01:07:24.287072',   '2011-01-07 01:07:24.287072',4)   重定向到   http://localhost:3000/recovers/14   完成302发现于119ms

RecoversController#创建

  

def创建       @recover = Recover.new(params [:recover])

respond_to do |format|
  if @recover.save
    format.html { redirect_to(@recover, :notice =>
     

'已成功创建恢复。')}           format.xml {render:xml => @recover,:status => :创建

     

:location => @recover}

  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @recover.errors, :status =>
     

:unprocessable_entity}         端

end  
     

1 个答案:

答案 0 :(得分:5)

您需要调用save以将新值写入数据库:

def checkin
  combo = Combo.find_by_id(combo_id)
  combo.occupied = true
  combo.save!
end

如果您使用update_attribute,这会更容易。此外,如果您有belongs_to关系,则可以免除find

belongs_to :combo

def checkin
  if combo # true unless combo_id is nil
    combo.update_attribute(:occupied,true)
  end
end

请注意,update_attribute会绕过验证。如果您需要验证,请改用update_attributes(:occupied=>true)