maco's life

最近は技術以外のことを主に記載しています。

Railsで複合PKを使う際に`Undefined method 'to_sym'`がでて辛かったメモ 

Railsidcreated_atを複合PKにしたくてschema.rbに直接下記のような定義を書いていた。

# 例
create_table "tests", id: false, force: :cascade do |t|
  t.integer  "id", limit: 8
  t.datetime "created_at",     null: false
  t.datetime "updated_at",    null: false
end

execute "ALTER TABLE `tests` ADD PRIMARY KEY (`id`, `created_at`);"
execute "ALTER TABLE `tests` MODIFY `id` BIGINT AUTO_INCREMENT;"

直接いじっているのは、いろんな経緯があってのことなのでここでは説明しません。

bundle exec rake db:resetを実行して期待通りに複合PKがはられたテーブルになっていたのでよっしゃいけるぞ!とおもってモデルで

def self.update
  test = Test.find(...)
  test.touch
  test.save!`
end

以上のようなコードを書いて実行してみるとUndefined method 'to_sym'のようなエラーがでて???ってなってた。

いろいろ試行錯誤してみて全く意味がわからなかったのでいろいろ調べてみると、rails(というかActiveRecord)が備えているそのままの機能では複合PKは扱えないそうで、それが原因かーとおもって更に調べると次の記事にたどりついた。

記事の内容通りに複合PKを扱うgemのcomposite_primary_keysを使って、self.primary_keysを定義したところ無事saveすることができた。