Active Record attribute methodまとめ（その④: Query, Read, Write編）

# はじめに
今回はActive Recordのattribute methodのうち、Query, Read, Writeメソッドをまとめていきます。
（2022年6月時点。Rails7.0対応。）
その他のメソッドについては、別記事でまとめてますので是非ご覧ください。
[ActiveRecord attribute methodまとめ（その①: BeforeTypeCast編）](https://qiita.com/maabow/items/33ad5328b192e3adb49e)
[ActiveRecord attribute methodまとめ（その②: Dirty編）](https://qiita.com/maabow/items/0a5a228fb6c1447877e0)
[Active Record attribute methodまとめ（その③: PrimaryKey編）](https://qiita.com/maabow/items/012c473312961ce7e060)

# 検証環境
以下のschemaとmodelに基づいて検証を行なっています。
``` Ruby
# db/schema.rb
create_table "todos", charset: "utf8mb4", force: :cascade do |t|
  t.string "title"
  t.datetime "schedule_at"
  t.integer "status"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

# app/model/todo.rb
class Todo < ApplicationRecord
  enum status: { not_yet: 0, complete: 1, in_progress: 2, cancel: 3 }
end
```

# Query

## query_attribute
指定したattribute名の値が存在するかどうかを返却します。
`[attribute名]?`と同様の処理になります。
存在しないattribute名を指定するとNoMethodErrorの例外を吐きます。
``` Ruby
todo = Todo.new
todo.query_attribute(:status) #=> false
todo.status? #=> false
todo.status = :not_yet
todo.query_attribute(:status) #=> true
todo.status? #=> true
# 存在しないattributeに対して実行するとNoMethodErrorの例外を吐く
todo.query_attribute(:error_attribute) #=> NoMethodError (undefined method `error_attribute'...
```

# Read

## read_attribute
指定したattributeの値を返却します。型キャストされた状態で値は返却されます。
attribute名はシンボルでも文字列でも指定可能です。
``` Ruby
todo = Todo.new(schedule_at: '2021-02-02 22:22:22')
todo.read_attribute('schedule_at') #=> Tue, 02 Feb 2021 22:22:22.000000000 JST +09:00
todo.read_attribute(:schedule_at) #=> Tue, 02 Feb 2021 22:22:22.000000000 JST +09:00
```

# Write

## write_attribute
指定したattributeの値を更新します。
IntegerやFloatのカラムに対して空文字を指定した場合はnilに変換されます。
attributeの値を更新するだけで、UPDATE文が流れるわけではないのでお気をつけください。
``` Ruby
todo = Todo.find(1) #=> #<Todo id: 1, title: "title", schedule_at: "2022-09-07 17:43:00.000000000 +0900", status: "not_yet", ...>
todo.write_attribute(:title, '') #=> #<Todo id: 1, title: "", schedule_at: "2022-09-07 17:43:00.000000000 +0900", status: "not_yet", ...>
# IntegerやFloatのカラムに対して空文字を指定した場合はnilに変換される
todo.write_attribute(:schedule_at, '') #=> #<Todo id: 1, title: "", schedule_at: nil, status: "not_yet", ...>
todo.write_attribute(:status, '') #=> #<Todo id: 1, title: "", schedule_at: nil, status: nil, ...>
todo.write_attribute(:status, 3) #=> #<Todo id: 1, title: "", schedule_at: nil, status: "cancel", ...>
```

# おわりに
今回は、Query, Read, Writeメソッドについてまとめていきました。
正直なところ「直接attribute呼び出して処理したらええやん」という気持ちになったので、これらのメソッドのいい使い所があったら誰か教えてください。

その他のメソッドについては、別記事でまとめています。↓↓
[ActiveRecord attribute methodまとめ（その①: BeforeTypeCast編）](https://qiita.com/maabow/items/33ad5328b192e3adb49e)
[ActiveRecord attribute methodまとめ（その②: Dirty編）](https://qiita.com/maabow/items/0a5a228fb6c1447877e0)
[Active Record attribute methodまとめ（その③: PrimaryKey編）](https://qiita.com/maabow/items/012c473312961ce7e060)

# 参考
- [rails github](https://github.com/rails/rails/tree/main/activerecord/lib/active_record/attribute_methods)
- [Railsガイド](https://railsguides.jp/)
- [ActiveRecord::AttributeMethods::Query](https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Query.html)
- [ActiveRecord::AttributeMethods::Read](https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Read.html)
- [ActiveRecord::AttributeMethods::Write](https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Write.html)