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

问题描述:

我正在使用名为Recover的模型。在创建模型之前,我想使用Recover.combo_id属性作为参考来保存布尔属性Combo.occupied = true。如何使用回叫更新另一个模型?

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

recover.rb:

before_create:签

保护

DEF签 X = Combo.find_by_id(combo_id).occupied = 真

Rails控制台:

在2011-01-06开始POST “/复苏” 为127.0.0.1 17时07分24秒-0800
处理由 RecoversController#创建以HTML
参数:{ “UTF8”=> “”,“ ”authenticity_token“=>”o1Iu3Y9/rVBOZPoDUgVP/tRfQ8GxbdWC40DbPq9YxUE =“, ”recover“=> “commit”=>“创建恢复”}恢复 加载(0.2ms)选择“恢复”“id” “恢复”WHERE (“恢复”。“email”= '[email protected] arin.edu')LIMIT 1
恢复负荷(0.1毫秒)SELECT “复苏”。 “ID” FROM “恢复” WHERE ( “复苏”。 “combo_id”= 4)LIMIT 1
组合负荷(0.5ms的)SELECT“combos”* FROM“combos”WHERE(“combos”。“id”= 4)LIMIT 1 AREL(0.5ms)INSERT INTO “恢复”(“locker_number”,“email”, “ (NULL,'[email protected]', 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 [:恢复])

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

“恢复已成功创建。 ')} 格式。XML {渲染:XML => @recover,:状态=>:创建,

:位置=> @recover}

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

:unprocessable_entity} 端

end 

+0

似乎在您的RecoversController#create中没有创建任何对象。你能发布这个方法的内容吗? – apneadiving 2011-01-07 01:24:59

+0

当然可以。它完成 – 2011-01-07 01:27:37

您需要调用保存才能将新值写入数据库:

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)