4

Railsプロジェクトの構築を開始するのに役立つRails Migrationsについて読んでいます。

db/migrate でのファイルの生成について少し混乱しています。

私がこれまでアプリケーションを設計してきた方法は、モデルから始めることです...システムに含める予定のすべてのオブジェクトをできる限り概説します。rails migration generator を使用して、これらのモデルから自動的に移行ファイルを生成したいと思います。

はい、「移行を手動で作成するのは簡単だ」ということは知っています。手動で実行できることはわかっていますが、ツールが事前に作成されたモデルから分離されている理由がわかりません。

記事と SO に関するその他の移行に関する質問からの私の理解に基づいて、次のような移行を生成できます。

rails generate migration SomeObj field:string some_other_field:integer

モデルが SomeObj 用に既に存在するのに、なぜフィールドを渡す必要があるのですか? Rails は some_obj.rb からそれを検出し、そこから移行を作成できませんでしたか?

また、has_many、belongs_to、および has_to_and_belongs_to_many の関係を持つより複雑なモデルがある場合、JOIN テーブルとフィールドが正しい名前 (foreign_obj_id、foreign_obj_ids など) で自動作成されると非常に便利です。

以前のプロジェクトでは、Mongo+Mongoid を使用していたため、移行に対処する必要はありませんでした。コレクションは、Mongo の動作の性質上、自動的に生成されました (存在しないコレクションは、挿入または更新時に自動的に作成されます)。この Rails アプリでは Postgres を使用しています (しかし、MySQL やその他のリレーショナル データベースでも同じことが起こると確信しています)。

とにかく、この種のヘルパーはありませんか?これらの移行はすべて手動で作成する必要がありますか?

4

1 に答える 1

14

あなたはこれを逆に持っています。最初に移行を構築し、次にモデルを構築する必要があります。移行は、データベースの状態を進めます。モデルは、データベースの現在の状態を反映しています。モデルから移行への 1 対 1 のマッピングはありません。

rails migration generator を使用して、これらのモデルから自動的に移行ファイルを生成したいと思います。

できません。

を使用rails generate migrationして移行を生成すると、ほとんど副作用として、スタブ モデル ファイルが生成されます。モデルにはモデルを構成する実際の列に関する情報が含まれていないため、既存のモデル ファイルを使用してモデルの移行を生成することはできません。Rails は、関連付け/検証から必要なすべての情報を抽出して暗示する必要があり、それでもほとんどの列が間違っています。

また、より複雑なモデルを使用している場合は、JOIN テーブルとフィールドが正しい名前で自動作成されると、非常に便利です。

繰り返しますが、できません。データベース スキーマを定義する責任があります。その方法は、移行を構築することです。手動または 経由で行うことができますrails generateが、従うべきプロセスは、最初に移行を構築し、次にモデルを構築することです。

例として、ここに完全なモデルがあり、生産の準備ができています。

class MyModel < ActiveRecord::Base
end

そのモデル定義は、10 列または 1000 列を含むテーブルをラップする場合があります。あなた(およびRails)は、モデル定義に基づいて知る方法がまったくありません.

少なくとも 1 つの列を含む別のモデルを次に示しますが、ここでも列の種類を知る方法はありません。

class MyModel < ActiveRecord::Base
  validates :code, presence: true, uniqueness: true
end

文字列ですかcode、それとも数値ですか? 列にインデックスが必要ですか? 知る由もありません。

于 2013-01-22T05:25:00.807 に答える