概要
railsでは複合主キーを持つテーブルはサポート外となっていますが、多対多の中間テーブルにAUTO INCREMENTのIDを振るのはものすごい無駄な気がして嫌なので、その用途に限り私たちの会社では使用を許可しています。
ただ、下記のような大量のWARNINGが出ます。
WARNING: Active Record does not support composite primary key.
shop_user has composite primary key. Composite primary key is ignored.
テスト実行時などはこのWARNINGが邪魔なのでなんとか非表示に出来ないか調べました。
コード
強引にモンキーパッチです。読み込まれる場所であればどこでやってもかまいませんが私はconfig/initializers/monkey_patches.rb
にまとめてます。
# config/initializers/monkey_patches.rb
module ActiveRecord
module AttributeMethods
module PrimaryKey
module ClassMethods
private
# 元のコード
# https://github.com/rails/rails/blob/bfbf696ed82df38b68331254f65c25813da83559/activerecord/lib/active_record/attribute_methods/primary_key.rb#L122-L130
def suppress_composite_primary_key(pk)
pk unless pk.is_a?(Array)
end
end
end
end
end
注意点
この記事は複合主キーの使用やモンキーパッチを推奨する物ではありません。
複合主キーはrailsのサポート外で、上記のウォーニング意外にも色々問題があります。知ってる物だけでも列挙すると・・・
- SomeCompositePrimaryModel.first.destroyなどモデルを直接削除できない。
- 同じく更新できない。
- eager_loadできない。
なんか、使い物にならない感ありますね・・・まあ、回避できなくはないのですがその話はまた別の機会に。というわけで色々大変です。
また、モンキーパッチはrailsのバージョンが変わった時など、動かなくなったり、大きな問題を引き起こす可能性があります。自己責任でご利用ください。