Rails 7: delegated_typeでaccepts_nested_attributes_forをサポート(翻訳)
Rails 6.1で追加されたdelegated_type
は、ポリモーフィックなリレーションに似ています。delegated_type
を使うと多くの有用なメソッドやスコープが導入されます。この機能について詳しくは#39341を参照してください。
改修前
理解のために、以下の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_type
でaccepts_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ウォッチ20211115
delegated_type
でaccepts_nested_attributes_for
をサポート