ActiveRecordで結合処理時のperhaps you misspelled it?


Rails4でテーブルをleft outer join しようとしたら以下のエラーが出てはまったのでメモ。

Association named 'companies' was not found on DailyStockInfo; perhaps you misspelled it?

タイプミスを疑ってさまよっていましたが、modelに外部キーの記載がなかったことが原因でした。

以下のようにmodelを記載すればOK
(参照元テーブルAを参照先テーブルをBとします。)

class TableA < ActiveRecord::Base
  has_many :check_stock , foreign_key: [:name,:date]
end
class TableB < ActiveRecord::Base
  belongs_to :daily_stock_info ,foreign_key: [:name,:date]
end

このとき生成されたSQLを見ると、結合させたいキーが入れ子になる事象が発生しました。

~
TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.date 
 AND TableA.date = TableB.name
~

とりあえず、model側の外部キーの記載を入れ子にすることで解消しました。

class TableA < ActiveRecord::Base
  has_many :check_stock , foreign_key: [:name,:date]
end
class TableB < ActiveRecord::Base
  belongs_to :daily_stock_info ,foreign_key: [:date,:name]
end

その後このケースは再現してないですが、こういったこともあるようです。