Hatena::ブログ(Diary)

130単位

2013-09-03

Rails ポリモーフィック関連の関連名の命名

Railsポリモーフィック関連という機能があります。

class Picture < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end

class Employee < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

class Product < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

ざっくりいうと、複数の親Modelに属するような子Modelの関連を抽象化してまとめる機能です。詳しくはRails Guidesや以下のリンク先を参照ください。

関連名

ここで注目したいのが、Modelを関連づける関連名です。Rails Guidesの例にある "imageable"。聞き慣れないですが、どうなんでしょう。確かにimageは動詞でもあるため文法的には間違ってなさそうです。が、実際に扱おうとすると違和感が生じてきます。

親Modelから子Modelを参照する際は通常の関連と同様に扱えます。

pictures = employee.pictures

逆に子Modelから呼び出そうとすると、以下のようになります。

employee = picture.imageable

imageable というメソッドで employee が返るのはちょっとわかりにくい気がします。

命名具体例

調べていて、関連名の付けかたには2種類あるように見受けられました。(見出しは造語です)

able接尾辞
子Model関連名親Model
Comment :commentable Article/Photo
Address :addressable Person/Company
AttachmentImage :attachable Blog/Entry
抽象名詞
子Model関連名親Model
Item :parent User/Machine
Comment :resource Diary/Book/Shop
Paste :item Snippet/Picture
Employee :work_place Office/Factory

抽象名詞のほうで"parent"や"resource"は抽象度が高く、(開発者間で納得できれば)汎用的に使えそうです。英語の意味的には"object"も使いたいところですが、object_idが予約されているため使えません。

命名比較

able接尾辞
  • able接尾辞なModuleをincludeする感じ
  • 関連名が動詞+ableなので悩まなくて済む
  • 子Modelから親Modelの呼び出しがわかりにくい
  • Rails Guideで例示されているということは推奨なのかもしれない
  • 海外のBlog記事ではable接尾辞の採用が目立つ
抽象名詞
  • 抽象名詞なClass継承する感じ(STIのような命名)
  • 適切な関連名が見つかるかどうかは対象Modelと語彙力に依存
    • ここで割と具体的な名詞を使うと他のModelに使える名詞がひとつ減る(細かいけど)
  • 子Modelから親Modelの呼び出しがまだわかりやすい
  • 日本人エンジニアは抽象名詞を採用している例が見受けられる

まとめ

特に結論はありません。初めて使ってみた印象などを書いてみました。どちらを選択するかは好みの問題だと思います。ちなみに、自分のケースでは抽象名詞を採用しました。やはり子Modelからの参照時に名詞であったほうが違和感が少ないように思えたからです。たとえ返るObjectがメソッド名と異なったとしても、ですね。(ただし命名には苦労しました…)

ご意見などあれば遠慮なくいただけるとありがたいです!


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

4797363827
Rails3レシピブック 190の技

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/deeeki/20130903/polymorphic_associations_naming