Rails Rails 中 save 的事务问题

cdredfox · 2012年04月24日 · 最后由 gsky 回复于 2015年03月24日 · 7242 次阅读

rails 中的事务好象是以方法为单位提交的,比如我想在一个方法新增了一个对象后,马上就象使用这个对象的 id,这个需要怎么做呢?我尝试如下代码,好象会报错:

先 user.save,再 user.id 这样好象不行,user.id 为空。 我尝试 user.save 之后,然后用 nick 去数据库查,也是查不到的。原因因该是当前事务还没有提交。所以查不到? 我想咨询一下,是否有办法取到 user.id?或者强制 user.save 的时候,就事务提交?

user.save 如果没有保存成功, id 会为空,使用 user.save! 应该可以看到哪里错。

楼主最好把环境贴一下。

1.9.3p125 :001 > Project
 => Project(id: integer, name: string, created_at: datetime, updated_at: datetime) 
1.9.3p125 :002 > a = Project.new(:name => "New ONE")
 => #<Project id: nil, name: "New ONE", created_at: nil, updated_at: nil> 
1.9.3p125 :003 > a.save
   (0.1ms)  begin transaction
  SQL (416.5ms)  INSERT INTO "projects" ("created_at", "name", "updated_at") VALUES (?, ?, ?)  [["created_at", Tue, 24 Apr 2012 14:51:50 UTC +00:00], ["name", "New ONE"], ["updated_at", Tue, 24 Apr 2012 14:51:50 UTC +00:00]]
   (183.3ms)  commit transaction

我的环境 fedora16, rvm, ruby1.9.3,rails 3.2.x 即使取出 id,并没有问题。所以希望楼主提供更详细的背景

我在控制台里面也是可以保存成功的,我是指我在 controller 中的一个方法比中调用 save,好象马上取不到? 比如

def auth_controller ... user.save user.id #这里显示为 nil,或者使用 User.where(:name=>刚保存的用户名) 查出来的 user 对象为 nil. end

显然是没保存成功

单线程程序.. 上一行没执行完(事务还没提交),怎么可能运行到下一行.... 我觉得是 save 没成功.... 如果 save 成功是一定可以拿到的啊... 你加个 if,比如 if user.save.. 后面再做你的 search...

试了一下,确是出错了,错误信息为:ActiveRecord::RecordInvalid (translation missing: zh-CN.activerecord.errors.messages.record_invalid): 我的代码如下,很奇怪,因该不会报错呀:

user_info=User.where(:nick=>nick,:email=>email).first if(user_info.nil?) user_info=User.new user_info.nick=nick user_info.email=email
end user_info.session_update_date=Time.now user_info.session=@top_session user_info.save!

@cdredfox 这两行是啥情况?没见过。另外你应该在调用用户之前就复制给 current_user 变量,你的代码 User.where 查一次库并不是很优雅。

user_info.session_update_date=Time.now
user_info.session=@top_session

这两行代码是我自已定义的一个字段值。 我这个是这样,是检查这个用户是否存在,如果不存在就创建一个新的保存。如果存在就更新这两个值。

顺道再问一个简单的问题。在 rails 中有配置文件可以配置 Time.now 取得时间的时区吗? config.time_zone = 'Beijing' config.active_record.default_timezone = :Beijing 这个好象只对 active_record 和页面显示有效?

在网上看到有人说有个 ENV[] 可以设置?这个在哪设置?rails3 中?

#9 楼 @cdredfox 应该是到处有效 另外你的程序写这种 save 之后再去取值的最好是写成:

if user.save
   user.id
end

但我上面的语法看起来好象没有错呀,不懂为什么 save 的时候会报错?

加入国际化了?缺少提示信息貌似

#12 楼 @cdredfox 今天我也碰到了这个问题,和 LZ 症状一模一样,后来找到原因是因为在 model 中有 validate 条件造成可以在 console 中可以 save 但是不能在实际情况下 save 不知道 LZ 是不是这个错误,而且时间好像过去很久了。。。

谢 14 楼,我也是同样的问题才解决的

谢 14 楼...我也遇到了同样的问题..删了 validate 解决的..

需要 登录 后方可回复, 如果你还没有账号请 注册新账号