Techioz Blog

Ruby On Rails ActiveRecord は複数形ではなく単数形のテーブル名を探しています

概要

デフォルトでは、ActiveRecord は複数のテーブル名を検索します。したがって、私のアプリケーションでは、次のような Armor クラスを使用して Armor テーブルを参照できます。

class Armour < ApplicationRecord
end

これを実行すると、複数のテーブル名のアーマーを正しく呼び出すことができ、コンソールで呼び出すことができます。

irb(main):001:0> Armour.all
  Armour Load (0.5ms)  SELECT "armours".* FROM "armours"
  <output omittid>

ただし、Equipment という名前の別のモデルがあります。これは、正しい複数のテーブル名の Equipment を参照せず、代わりに単数形のテーブル名の Equipment を検索しようとします。これはこれを行う唯一のクラスですが、理由がわかりません。

class Equipment < ApplicationRecord
  has_many :soldier_equipment, dependent: :destroy
  has_many :soldier, through: :soldier_equipment
end
irb(main):002:0> Equipment.all
  Equipment Load (0.8ms)  SELECT "equipment".* FROM "equipment"
An error occurred when inspecting the object: #<ActiveRecord::StatementInvalid:"PG::UndefinedTable: ERROR:  relation \"equipment\" does not exist\nLINE 1: SELECT \"equipment\".* FROM \"equipment\"\n 

これはこのようなことを行う唯一のモデルですが、その理由はわかりません。 schema.rb ファイルは正常に見え、すべての移行は成功します。 Equipment モデルに次の行を追加すると、すべてが正常に機能しますが、非標準のテーブル名がどこから取得されているのかわかりません。

self.table_name = "equipments"

ActiveRecord はテーブル名をどこで定義しますか?

ルビーのバージョン:3.2.2 レールバージョン: 7.0.4.3 アクティブレコードのバージョン: 7.0.4.3 PostgreSQL 15.2 (自作) M1 CPUを搭載したMacBook Air

解決策

レールはデフォルトで語形変化を使用し、複数形の後の一部の名前は単数形のままです したがって、それを変更したい場合は、次の手順に従ってください。

/config/initializers フォルダーで inflections.rb ファイルを検索するか、このファイルが存在しない場合は単に作成します。次に、このコードを書きます

ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.irregular "equipment", "equipments"
end

語形変化は常に不規則メソッドを最初に実行するため、「機器」は常に複数形になります。