rails 中的事务好象是以方法为单位提交的,比如我想在一个方法新增了一个对象后,马上就象使用这个对象的 id,这个需要怎么做呢?我尝试如下代码,好象会报错:
先 user.save,再 user.id 这样好象不行,user.id 为空。 我尝试 user.save 之后,然后用 nick 去数据库查,也是查不到的。原因因该是当前事务还没有提交。所以查不到? 我想咨询一下,是否有办法取到 user.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 中?