通常の関連付けは、主キー/外部キーによって作成されます。
User "Bob", id: 1
Book "The Sponge", id: 1, user_id: 1
外部キーuser_id
は、ユーザーの主キーを参照します。
ポリモーフィックな関連付けは、主キー/外部キーに加えて、オブジェクトの「タイプ」で機能します。
User "Bob", id: 1
Book "The Sponge", id: 1, owner_id: 1, owner_type: "User"
ここでは、本の所有者を取得するために両方のフィールドが必要です。
所有者の id は 1 であり、所有者のタイプ (クラス) は "User" であることがわかっているので、id = 1 の User を見つけてみましょう。
これは、複数のタイプの所有者を持つことができることを意味します: poly (複数) - morphic (タイプ、クラス)
たとえば、Client オブジェクトが所有する Book を持つことができます。
Client "XXX", id: 12
Book "Catalog", id: 2, owner_id: 12, owner_type: "Client" # => owner is client #12
Book "Anoying", id: 3, owner_id: 20, owner_type: "User" # => owner is user #20
Rails フレームワークでポリモーフィックな関連付けを実装する方法:
class Book < ActiveRecord::Base
belongs_to :owner, polymorphic: true
end
class User < ActiveRecord::Base
has_many :books, as: :owner
end
class Client < ActiveRecord::Base
has_many :books, as: :owner
end
次に、次の行で本の所有者を見つけることができます。
book = Book.first
book.owner # => return the owner of the book, can be either Client or User