Wednesday 18 April 2012

belongs_to とクラス名指定

Railsでアプリケーションを組んだ時に、データベースのアソシエーションで少し苦労をしました。モデルの belongs_to でアソシエーションができません。

Wordpressを組んでいたときの習慣から管理者でログインして作業をする内容は /admin 以下に設置する設計で組みました。コントローラだけではなく、管理に関するモデルまで /admin の下に作りました。Railsの通常のアプリケーションの規約ではこのような設計はしないらしく、RESTが自動でモデルまで探してくれないことが原因で、規約にそって設計をしていれば

belongs_to :model_name

と記述すればアソシエーションが構築されるのですが、規約に従っていないためにクラス名を指定しないといけないということを minami.rb の業務後ティータイムで @yalab さんに教えてもらいました。

/admin 以下にモデルを作成した場合、正しくは

belongs_to :model_name, :class_name => 'Admin::ModelName', :foreign_key => 'id_column_name'

だそうです。

なぜそれが分かったのかという質問をしたところ、クラスのソースコードを読んである程度推測して分かったのだとか。

私が問題にぶつかったときはいつもGoogleでキーワードにエラーログのメッセージをタイプしてユーザフォーラムやブログ記事を見に行きます。でもこうすると結局解決しなかったスレッドがあったり、Rails/Ruby/pluginなどのバージョンが違ったりしてかなり記事を探すのに時間がかかります。ソースコードを読んでその中のドキュメントやソースコードを理解すれば、例えばサーバの設定やインタープリターなどのもっと深いところに問題が無い限りほぼ確実に解決します。

ソースを読むという習慣や感覚を身につけるのは時間と気力がいると思いますが、場当たり的に問題を解決しないのが実際は近道であるということを学べたのが、belongs_to の問題を解決できたことより大きな収穫でした。

No comments:

Post a Comment