Rails5.0.0.beta1で導入されるActiverecordのChangelogを見てみる


Rails5へのメジャーアップデートに向けて、目玉の新機能(Action Cable, API mode, Rails command)などの目が行きがちですが、`Activerecord`のちょっとしたメソッドの追加で便利になったりするので、`Activerecord`のChnagelogを軽く見てみたいと思います。

[全文はこちら](https://github.com/rails/rails/blob/v5.0.0.beta1/activerecord/CHANGELOG.md)

以下は私の抜粋です。

>ApplicationRecord is a new superclass for all app models, analogous to app controllers subclassing ApplicationController instead of ActionController::Base. This gives apps a single spot to configure app-wide model behavior.

>Newly generated applications have app/models/application_record.rb present by default.

>Genadi Samokovarov

モデルを定義する際に、`ActiveRecord::Base`では`ApplicationRecord`を継承するようになりました。

>Introduce after_{create,update,delete}_commit callbacks.

>Before:

>after_commit :add_to_index_later, on: :create
after_commit :update_in_index_later, on: :update
after_commit :remove_from_index_later, on: :destroy

>After:

>after_create_commit  :add_to_index_later
after_update_commit  :update_in_index_later
after_destroy_commit :remove_from_index_later

>Fixes #22515.

>Genadi Samokovarov

今までなんでないのかと思っていましたが、after_{create,update,delete}_commitのコールバックが追加されました。

>Added ActiveRecord::Relation#left_outer_joins.

>Example:

>User.left_outer_joins(:posts)
>\# => SELECT "users".* FROM "users" LEFT OUTER JOIN "posts" ON
     "posts"."user_id" = "users"."id"

>Florian Thomas

LEFT OUTER JOINできるメソッドが追加されました。

>Alias ActiveRecord::Relation#left_joins to ActiveRecord::Relation#left_outer_joins.

>Takashi Kokubun

`left_joins`が`left_outer_joins`のエリアスになります。

>Add option to index errors in nested attributes

>For models which have nested attributes, errors within those models will now be indexed if :index_errors is specified when defining a has_many relationship, or if its set in the global config.

>Example:

>class Guitar < ActiveRecord::Base
  has_many :tuning_pegs
  accepts_nested_attributes_for :tuning_pegs
end

>class TuningPeg < ActiveRecord::Base
  belongs_to :guitar
  validates_numericality_of :pitch
end

>\# Old style
guitar.errors["tuning_pegs.pitch"] = ["is not a number"]

>\# New style (if defined globally, or set in has_many_relationship)
guitar.errors["tuning_pegs[1].pitch"] = ["is not a number"]

`accepts_nested_attributes_for`を使ってバリデーションエラーが出たときに、何番目のインスタンスがエラーになっているかわかりやすくなります。

>Add ActiveRecord::Relation#in_batches to work with records and relations in batches.

>Available options are of (batch size), load, begin_at, and end_at.

>Examples:

>Person.in_batches.each_record(&:party_all_night!)
Person.in_batches.update_all(awesome: true)
Person.in_batches.delete_all
Person.in_batches.each do |relation|
  relation.delete_all
  sleep 10 # Throttles the delete queries
end

>Fixes #20933.

>Sina Siadat

`#in_batches`はブロックに`ActiveRecord::Relation`を渡せます。

>belongs_to will now trigger a validation error by default if the association is not present. You can turn this off on a per-association basis with optional: true. (Note this new default only applies to new Rails apps that will be generated with config.active_record.belongs_to_required_by_default = true in initializer.)

>Josef Šimánek

`belongs_to`の値が必須になりました。`config.active_record.belongs_to_required_by_default`でデフォルトの設定を変えるか、`belongs_to`の設定する際に`optional: true`を追加すれば、必須ではなくなります。


>Added the #or method on ActiveRecord::Relation, allowing use of the OR operator to combine WHERE or HAVING clauses.

>Example:

>Post.where('id = 1').or(Post.where('id = 2'))
\# => SELECT * FROM posts WHERE (id = 1) OR (id = 2)

>Sean Griffin, Matthew Draper, Gael Muller, Olivier El Mekki

ついに来ましたね。ORで検索ができるようになりました。

>Provide :touch option to save() to accommodate saving without updating timestamps.

>Fixes #18202.

>Dan Olson

saveメソッドに`touch`オプションが追加されて、タイムスタンプを更新せずにレコードの更新ができます。