Skip to content

Instantly share code, notes, and snippets.

@masarakki
Created January 22, 2015 10:31
Show Gist options
  • Save masarakki/ccc49d33f0f1202037b3 to your computer and use it in GitHub Desktop.
Save masarakki/ccc49d33f0f1202037b3 to your computer and use it in GitHub Desktop.
model gem化の話

前提

  • mymodels.gem を
  • アプリケーションから使う
  • アプリケーション側で拡張は必須(特にdefault_scopeとか)
  • アプリケーション側でモデルの拡張は app/models/* でやりたい

railsのautoload

存在しないconstを叩くとautoloadする [app/models/, GEMPATH/mymodels/app/models/, ... ] と行った感じのロードパスから探す 定数名とpathは一致する必要がある

models.gem

mountableなengine app/models を持つ

モデルの配置方法の候補は2つ

  • app/models/mymodels/*
  • app/models/*

app/models/* の場合

フラットに配置する

この場合relationが非常にわかりやすい Hoge.first.hages は app/models/hage をロードする

ただし 拡張はしにくい アプリケーション側で app/models/hoge を作ってしまうとそっちをautoloadしてしまう 何かの方法でgem側のファイルをロードしておくと今度はアプリ側のapp/models/* がautoloadできない

app/models/mymodels/* の場合

autoloadで混乱することはないがrelationが作りにくい

book <- book_authors -> author のようなrelationがgemで作られていて アプリケーション側で book と author だけを継承して拡張した場合

book.book_authors
#=> [<Mymodels::BookAuthor ...>, <MyModels::BookAuthor ...>, ... ]

ここまではよいが

book.book_authors.first.authors
#=> [<Mymodels::Author ...>, <Mymodels::Author ...>, ...]

となってしまい 期待していた Author ではない

必ずすべてのモデルを継承するというのはやりたくないし Mymodels::* を直接いじるのは・・・
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment