はじめに
Rails 6 に追加されそうな新機能を試す第29段。 今回は、 ActiveRecord::Result.to_a
編です。
Rails 6 では、 ActiveRecord::Result.to_hash
は DEPRECATION WARNING
が出るようになります。
代わりに、 ActiveRecord::Result.to_a
が用意されました。
ActiveRecord::Result.to_hash
が Array
オブジェクトを返していたため、それに合わせてメソッド名を変更するということみたいです。
Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
$ rails --version
Rails 6.0.0.rc1
Rails プロジェクトを作る
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
User モデルを作る
$ bin/rails g model User name
migration の実行
$ bin/rails db:create db:migrate
データを作る
ちょっと試すために、データを2件登録します。件数に深い意味はありません。
bash-4.4# bin/rails c
Running via Spring preloader in process 109
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> User.create(name: 'Taro')
...(略)
irb(main):002:0> User.create(name: 'Hanako')
...(略)
select_all を使って ActiveRecord::Result オブジェクトを取得する
selec_all を使って、データを検索し、ActiveRecord::Result オブジェクトを取得します。
irb(main):003:0> conn = ActiveRecord::Base.connection
... (長いので略)
irb(main):004:0> users = conn.select_all("SELECT * FROM users")
(0.5ms) SELECT * FROM users
... (長いので略)
取得した users
は ActiveRecord::Result オブジェクトです。
irb(main):005:0> users.class
=> ActiveRecord::Result
to_hash と to_a
to_hash
と to_a
メソッドを実行してみます。
to_hash
を実行すると DEPRECATION WARNING が表示されます。
irb(main):006:0> users.to_hash
DEPRECATION WARNING: `ActiveRecord::Result#to_hash` has been renamed to `to_a`. `to_hash` is deprecated and will be removed in Rails 6.1. (called from irb_binding at (irb):5)
=> [{"id"=>1, "name"=>"Taro", "created_at"=>2019-06-01 07:17:28 UTC, "updated_at"=>2019-06-01 07:17:28 UTC}, {"id"=>2, "name"=>"Hanako", "created_at"=>2019-06-01 07:17:37 UTC, "updated_at"=>2019-06-01 07:17:37 UTC}]
to_a
を実行すると DEPRECATION WARNING
は表示されません。
irb(main):006:0> users.to_a
=> [{"id"=>1, "name"=>"Taro", "created_at"=>2019-06-01 07:17:28 UTC, "updated_at"=>2019-06-01 07:17:28 UTC}, {"id"=>2, "name"=>"Hanako", "created_at"=>2019-06-01 07:17:37 UTC, "updated_at"=>2019-06-01 07:17:37 UTC}]
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try029_activerecord_result_to_a