直接询问对象与遍历所有 table 条目时属性值的差异

Difference in an attribute value when asking object directly vs iterating over all table entries

我的 table.

中有一个特定对象出现奇怪的异常现象

例如。假设我有一个 User table 具有属性 birthday.

如果我遍历 User table 即使根本不询问任何属性,我也会因为输入无效而收到错误消息:

1.9.3-p551 :022 >   begin
1.9.3-p551 :022 >     User.all.map {|u| u }
1.9.3-p551 :023?>   rescue => e
1.9.3-p551 :024?>     puts "Problem with user #{u.id}, error: #{e}"
1.9.3-p551 :025?>   end
  User Load (267.5ms)  SELECT `user`.* FROM `user`
Problem with user 2569, error: Invalid date in field 'birthday': 1998-07-00
 => nil

现在,如果我直接从当前有问题的对象询问它的​​生日,它会给我正确数据类型的正确值:

1.9.3-p551 :027 > u = User.find(2569)
1.9.3-p551 :027 > u.birthday
 => Tue, 12 Oct 2000 

schema 中定义的属性:

 create_table "users", :force => true do |t|
  t.date      "birthday"

当你调用 User.all.map {|u| u } 用户收到传递给它的消息 inspect。默认情况下只检查 returns 格式良好的对象版本。所以因为它有生日的错误数据,所以它会出错。

http://apidock.com/rails/ActiveRecord/Base/inspect

解决方案是进行数据迁移,以预期格式获取所有生日。

你的问题与变量范围有关:在 map 块内,u 被定义为当前迭代对象,但在该块外 u未定义.

那错误输出怎么会给出u.id你可能会问。

那是因为您在整个块之外定义了 u(可能是一些较早的测试)。

遵守此代码:

u = 1
puts "before: #{u}"
5.times{|u| puts u}
puts "after: #{u}"

输出:

before: 1
0
1
2
3
4
after: 1