Techioz Blog

Rails (モデルの生成) は複数ではなく単数化されたテーブルを作成しています – モデルも単数テーブルを探しています

概要

次のコマンドを使用しました。

$ レール g モデル 装備

そして、レールは次のことを実行しました。

  invoke  active_record
  create    db/migrate/20160822040448_create_equipment.rb
  create    app/models/equipment.rb
  invoke    test_unit
  create      test/models/equipment_test.rb
  create      test/fixtures/equipment.yml

ご覧のとおり、移行は独特です。そこで、移行ファイルとテーブル名を次のように変更しました。

class CreateEquipments < ActiveRecord::Migration
  def change
    create_table :equipments do |t|
      # ...
    end
  end
end

ここで、Rail のコンソール $rails c を開始する $ rake db:merge を実行した後、Equipment を開始しようとすると、テーブルが見つからないというエラーが発生します。

>> Equipment.new
PG::UndefinedTable: ERROR:  relation "equipment" does not exist
LINE 5:                WHERE a.attrelid = '"equipment"'::regclass
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                FROM pg_attribute a LEFT JOIN pg_attrdef d
                  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
               WHERE a.attrelid = '"equipment"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "equipment" does not exist
LINE 5:                WHERE a.attrelid = '"equipment"'::regclass
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                FROM pg_attribute a LEFT JOIN pg_attrdef d
                  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
               WHERE a.attrelid = '"equipment"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum

次の行をモデルに追加することで修正できました。

    class Equipment < ActiveRecord::Base
        self.table_name = 'equipments'
        # ...
    end

これで問題は解決しましたが、そもそも問題の原因が知りたいのです。

最後の注意: コンソールで #pluralize メソッドを実行してみましたが、文字列「Equipment」も複数形になりませんでした。

>> 'Equipment'.pluralize
=> "Equipment"
>> 'door'.pluralize
=> "doors"

解決策

装備に複数はありません

http://www.learnersdictionary.com/qa/equipments-equipment-noncount-mass-noun-singular-plural

これは、そのような単語に対して予期される動作です。