2012-04-11 114 views
1

我遇到数据映射程序不更新模型的问题。我可以创建并保存模型而不会造成问题。我已启用raise_on_save_failure并检查返回值update但看到没有错误。Datamapper“更新”不更新记录

这里是模型:

class UserProfile 
    include DataMapper::Resource 
    attr_accessor :id, :wants_hints, :is_beta_user 
    property :id, Serial #auto-increment integer key 
    property :is_beta_user, Boolean 
    property :wants_hints, Boolean 
    has 1, :user, :through => Resource 
end 

这里是它在控制器被更新:

if user = User.get(request.session[:user])  
    if request.params[:user_profile]   
    beta = request.params[:user_profile].has_key?('is_beta_user')   
    hints = request.params[:user_profile].has_key?('wants_hints')   
    user.user_profile.update({:is_beta_user => beta, :wants_hints => hints}) # returns true 
    Log.puts user.user_profile.errors.each {|e| Log.puts e.to_s} # returns empty list [] 
    end  
end 

当控制器被称为update总是返回true,并且永远不会有误差错误列表。数据映射器日志设置为:debug,仅显示用于检索useruser_profileSELECT查询,这就是全部。为什么我能够save一个新创建的模型,但不允许update相同的模型?

回答

2

删除attr_accessor修复了这个问题。从我的研究attr_accessor用于不在数据库中的属性。

1

DataMapper的saveupdate不一定会产生UPDATE句子。它只会在模型对象所保存的数据发生变化时才这样做。因此,例如,在下面的代码update将返回true但不会产生UPDATE

# This generates an INSERT 
user = User.create(:login => 'kintaro', :email => '[email protected]') 

# This does NOT generate an UPDATE 
user.update(:login => 'kintaro') 

如果你这样做,但是,UPDATE会产生:

# This generates an UPDATE 
user.update(:login => 'kintaro22') 

也许这发生了什么?

+0

检查并重复检查。它肯定会更新新值的属性。 – nathan 2012-04-13 22:03:21