LoginSignup
1
2

More than 3 years have passed since last update.

railsの複合主キーの警告を非表示にする

Posted at

概要

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のバージョンが変わった時など、動かなくなったり、大きな問題を引き起こす可能性があります。自己責任でご利用ください。

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2