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

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

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

hoges foos
id id
title 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