ポリモーフィック関連でギブアップした話

プログラミングを本格的にスタートして4ヶ月目に入りましたさかもとです。

今回はポリモーフィック関連が定義されていることに気づかず、愚直に既存モデルから値を引っ張ってこようとして泣いたという話をアウトプットしようと思います。

 

ポリモーフィック関連って?

 

Railsガイドには一つの関連付けで複数のモデルと関連を持つことができる。と記述されています。

実装方法は下記のように書きます。

 

=================================================

例)Userモデルにadminとemployeeの二つのモデルを関連付けたい

userモデル

```

belongs_to :position,  polymorphic: true

``` 

adminモデル

```

has_many :users, as: :position

```

employeeモデル

```

has_many :users, as: :position

```

==================================================

 

userモデルでポリモーフィックを定義しています。

今回userモデルに複数のadminモデルとemployeeモデルが派生していると仮定して、userモデルに対してhas_manyで定義されています。

as: :positionとしているのは@user.positionと呼び出すとそのuserのpositionを呼び出すことができます。

逆に@employee.positionと定義すればuserモデルのインスタンスを取得することも可能です。

 

どういう時に使うの?

 

私が1番疑問に思ったのはここでした。正直、今までの関連づけでよくないか?と。

しかし場合によってはポリモーフィックはとても便利です。

それはどんな時か

```

一つのモデルの中で権限や役割、メソッドが派生した場合

```

です。

?????って感じだと思います。

先ほどの例で説明してみましょう。

 

=====================================================

 

Userモデルの中にadminとemployeeが派生していました。

このadminとemployeeってどんなモデルでしょう。

admin = 管理者権限が付与されている

employee = 一般ユーザー

このような役割です。

しかし、どちらのモデルもuserモデルの情報は変わりません。

あくまで1人のUserがどちらのpositionにいるのかという状態です。

このように情報を共有しながら一部だけ違う場合は通常の関連付けよりポリモーフィックを使用する方が実装は簡単にすみます。

 

=====================================================

 

まとめ

 

モデルの実装は奥が深くテーブルが増えれば増えるほど複雑になっていきます。

こう言った実装方法を覚えていきながら進んで行こうと思います。

 

参考記事

 

Active Record の関連付け - Railsガイド