直接询问对象与遍历所有 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
我的 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