06/09/18 15:33:11
なんかいろいろ調べたけど、問題点は2つあるみたいです。
1. プライマリキーがid以外の場合は set_primary_key 'xxx' 以外に xxx_before_type_cast の定義が必要
2. プライマリキーはauto_incrementまたはserialのように自動設定されなければならない
>>419だとプライマリキーの名前がcodeであり、かつauto_incrementがないので、両方にひっかかってました。名前だけの問題だと思ってたけどそうじゃなさそうです。
今のテーブルだと、(いいか悪いかは別にして)プライマリキーの値はユーザが入力することになってるんですけど、ActiveRecordではそういうのは想定してないっぽい。
試行錯誤して、モデルにいろいろ追加していちおう動くようにはなったんですけど、正しい保証はまったくないです。
class Account < ActiveRecord::Base
## 1. プライマリキーをidではない名前にする
set_primary_key 'code'
def code_before_type_cast
read_attribute(:code) # or code
end
## 2. ユーザ入力値をプライマリキー値に設定する
def initialize(attributes=nil)
super
self.id = attributes[:code] if attributes
end
# def before_create
# self.id = code
# end
end