Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7: delegated_typeでaccepts_nested_attributes_forをサポート(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

参考: 週刊Railsウォッチ20211115 delegated_typeaccepts_nested_attributes_forをサポート

Rails 7: delegated_typeでaccepts_nested_attributes_forをサポート(翻訳)

Rails 6.1で追加されたdelegated_typeは、ポリモーフィックなリレーションに似ています。delegated_typeを使うと多くの有用なメソッドやスコープが導入されます。この機能について詳しくは#39341を参照してください。

訳注

delegated_typeについて詳しくは以下の記事もどうぞ。

Rails: ActiveRecord::DelegatedType APIドキュメント(翻訳)

改修前

理解のために、以下のNoteモデルの宣言を考えてみましょう。

# app/models/notes.rb
class Note < ApplicationRecord
  delegated_type :authorable, types: %w[ Customer Employee ]
end
# app/models/employee.rb
class Employee < ApplicationRecord
end

従来はdelegated_typeレコードを新規作成するときに以下のように書きます。

emp_one = Employee.create!(name: "emp one")
Note.create!(authorable: emp_one, body: "sample text")

ネステッド属性を用いてこのノートを保存しようとするとエラーになります。

params = { note: { authorable_type: 'Employee', body: "sample text", authorable_attributes: { name: 'Emp one' } } }

Note.create!(params[:note])
# ArgumentError: Cannot build association `authorable'. Are you trying to build a polymorphic one-to-one association?

改修後

Rails 7から、delegated_typeaccepts_nested_attributes_forがサポートされました。これを用いると、以下のようにレコードを保存できるようになります。

# app/models/notes.rb
class Note < ApplicationRecord
  delegated_type :authorable, types: %w[ Customer Employee ]

  accepts_nested_attributes_for :authorable
end
params = { note: { authorable_type: 'Employee', body: "sample text", authorable_attributes: { name: 'Emp one' } } }
note = Note.create!(params[:note])

この機能について詳しくは#41717を参照してください。

関連記事

Rails 7: with_lockでもtransactionのロック戦略引数を指定可能になった(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。