Handling master data in database with Rails3

Rails で database に master data をつっこんで扱いたい場合の注意書きというかこんなんでできましたというまとめ。

まず関連付けというか association をどうするか。たとえば燃えるゴミの日を check box なんかで選択させたい。手っ取り早いのは曜日の表示名を master data として用意しておいて燃えるゴミの日を表す model と関連付けてやればいい。

class WeekDay < ActiveRecorde::Base
end

class Waist < ActiveRecorde::Base
  belongs_to :week_day
end

このときどういう関係かを考えなくちゃいけないんだけど上記のとおり燃えるゴミの日 model が曜日 model に属するのが正しいぽい。どっちがどっちを持つかとか属するかとか考えるとわけわからなくなるので「その model が他の model を必要とせずに単独で存在できるかどうか」という規則で決める。他の model に拠っている方が単独で存在できる方に属している、という関係。

細かいこと考えるといろいろあるんだけど曜日は常識として、つまり曜日 model は単独で存在できるとしていい。で、燃えるゴミの日は曜日の存在を前提として決められている。ということは燃えるゴミの日 model は曜日 model に拠っている。なので「燃えるゴミの日は曜日に属している」ということになるわけだ。

逆に「曜日は燃えるゴミの日をたくさん持っている」としても等価なんだけどそもそも曜日は燃えるゴミの日のことなんか知らない、知らなくても存在できるわけなので has_many の関係を持たせるのは意味合いがちょっと違う。あくまで依存するものに関係を記述してやるのがいい、というわけだね。