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