Я обнаружил эту ошибку, когда воспроизводил демо-приложение Майкла Хартла (Michael Hartl) из его руководства по рельсам.
Я зашел в консоль рельсов
рельсы c
Я запросил массив хэшей User.all и прогнал его по шагам:
2.0.0-p0 :012 > User.all
User Load (0.3ms) SELECT "users".* FROM "users" => [#<User id: 2, name: "Lisa Johnson", email: "[email protected]", created_at: "2013-04-02 03:30:06", updated_at: "2013-04-02 03:30:06">]
2.0.0-p0 :013 > Пользователь.все[0]
User Load (0.2ms) SELECT "users".* FROM "users" => #<User id: 2, name: "Lisa Johnson", email: "[email protected]", created_at: "2013-04-02 03:30:06", updated_at: "2013-04-02 03:30:06">
2.0.0-p0 :015 > User.all[0]['id']
User Load (0.2ms) SELECT "users".* FROM "users" => 2
Все идет нормально.
Однако User.all не отвечает на команду перечислить, скажем, только идентификаторы или имена всех пользователей:
2.0.0-p0 :017 > User.all { |i| помещает i['id']
User Load (0.2ms) SELECT "users".* FROM "users" => [#<User id: 2, name: "Lisa Johnson", email: "[email protected]", created_at: "2013-04-02 03:30:06", updated_at: "2013-04-02 03:30:06"gt;]
2.0.0-p0 :019 >User.all{ |i| помещает я['имя']
User Load (0.3ms) SELECT "users".* FROM "users" => [#<User id: 2, name: "Lisa Johnson", email: "[email protected]", created_at: "2013-04-02 03:30:06", updated_at: "2013-04-02 03:30:06">]
Присвоение произвольной переменной a массиву хэшей User.all решает проблему:
2.0.0-p0 :021 >a.each {|i| помещает i['id']
2 => [#<User id: 2, name: "Lisa Johnson", email: "[email protected]", created_at: "2013-04-02 03:30:06", updated_at: "2013-04-02 03:30:06">]
2.0.0-p0 :022 >a.each {|i| помещает я['имя']
Lisa Johnson => [#<User id: 2, name: "Lisa Johnson", email: "[email protected]", created_at: "2013-04-02 03:30:06", updated_at: "2013-04-02 03:30:06">]
Эта проблема User.all затрагивает как минимум версии ruby 1.9.2, 1.9.3 и 2.0.0. Тот, кто отвечает за написание гема, создавшего User.all, должен просмотреть свой метод all. Что бы это ни стоило, я работаю с рельсами 3.2.12.