Active Record で JOIN (joins) した際のプチハマり案件

(本質的な)結論

単数形と複数形を意識する

実例

UserモデルとTweetモデルがあるとする。

アソシエーション

アソシエーションを以下のように定義した(してしまった)とする。has_many :tweetsではなくhas_many :tweetと、単数形で定義している。

  class User < ActiveRecord::Base
    has_many :tweet
  end

  class Tweet < ActiveRecord::Base
    belongs_to :user
  end

joins する

このとき、以下の書き方だとエラーになる*1

User.joins(:tweets)

そしてこう書くと通る(通ってしまう)。

User.joins(:tweet)

つまり

has_manyの引数は複数形でなければいけないが、単数形でもそれなりに通ってしまう(結果は同じ)。が、SQL 文に展開されると誤った記述だと当然ながらエラーになる。

*1:厳密には下記の時点ではエラーにはならないが

Powered by はてなブログ