Rails 主キー以外での特定カラムのアソシエーション


例えば、こういったテーブルがあった時、

hoges foos
id id
foos hoge
last_foo no

hogesはfoosをhas_manyで持つ関係とする。

通常はこういうfoosを指定すれば、foos.hogeに対してリレーションを貼れるんだけど、

has_many :foos


last_fooカラムでfoosの特定のレコードを指したい場合は以下のように記述する。

belongs_to :last_foo, foreign_key: "last_foo", class_name: 'Foo', required: false

foreign_keyは結合元のhogesのカラム名。class_nameは結合先のモデル名。デフォルトで必須のモデルプロパティとなるから後から決まるような値の場合、require:falseとする。

また、この場合、foos.idと結合しにいくんだけど、

hoges join foos on hoges.last_foo = foos.id


foos.noとかにしたい場合、primary_keyという引数を指定するみたい。

belongs_to :last_foo, foreign_key: "last_foo", primary_key:"no" class_name: 'Foo', required: false

するとこうなる。

hoges join foos on hoges.last_foo = foos.no