Railsでid
とcreated_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することができた。