データベース スキーマを再作成するには、かなりの時間がかかります。
app/models、app/controllers app/views ディレクトリで、データベースに関する多くの情報を取得できます。
ActiveRecordでは、モデルのすべての属性を明示的にリストする必要がないことを知っておく必要があります。これには重要な意味があります。属性が参照されているかどうかに基づいて、どの属性をデータベースに追加する必要があるかを推測することしかできません! これは、これを行うことがちょっとした ART になることを意味します。そして、この作業を完了するための明確な手順はありません。しかし、以下はあなたを助けるために使用できるいくつかのルールです.
これは大きなプロジェクトです。以下はガイドライン、ルール、ヒントです。ただし、これには長い時間がかかる可能性があり、これを完了するのにイライラする場合があることに注意してください.
必要なテーブル:
通常、各テーブルには一致するActiveRecord::Baseモデルがあります。したがって、app/models ディレクトリで、各ファイルを確認し、クラスが ActiveRecord::Base から継承されている場合、それは余分なテーブルです。
テーブル名はデフォルトで、クラス名の複数形のスネーク ケース バージョンです。
class UserGroup < ActiveRecord::Base # for this class
テーブルの名前は user_groups です。複数形で、キャメルケースではなく小文字で、単語を区切るためにアンダースコアが付いていることに注意してください。
これらすべてのテーブルには、「id」整数列があります。デフォルトでは、テーブルには datetime 型の「created_at」および「updated_at」列もあります。
関連付けと外部キー:
モデル内の関連付けによって、どの外部キーが存在するかを推測できます。すべての関連付けが明示的にリストされているため、これはそれほど難しくありません。
例えば:
class UserGroup < ActiveRecord::Base # for this class
belongs_to :category
これは、user_groups テーブルに「category_id」という名前の列があることを意味します。これは、category テーブルの外部キーです。
これは、Category モデルに逆の関係がある可能性が高いことを意味します (ただし、余分な列はありません)。
class Category < ActiveRecord::Base
has_many :user_groups
主な他の関連付けは has_many_and_belongs_to 関連付けです。例えば。
class A < ActiveRecord::Base
has_and_belongs_to_many :bs
end
class B < ActiveRecord::Base
has_and_belongs_to_many :as
end
これは、外部キー「a_id」と「b_id」を持つ「as_bs」(as と bs はアルファベット順にソートされている) と呼ばれる追加する結合テーブルがあることを意味します。
すべての外部キーは整数です。
属性
わかりました、それでテーブルの関連付けです。さて、通常属性ですが…
app/views/user_groups/または他の同様のapp/viewsディレクトリを確認する必要があります。
内部には、ビュー テンプレートがあります。_form.html.erb テンプレートを確認する必要があります (.erb テンプレートであると仮定します。それ以外の場合は、.haml などのテンプレートである可能性があります)。
_form.html.erb テンプレートが存在する場合、通常、多くの属性がフォーム フィールドとしてリストされます。
form_for
ブロックで、「f.text_field :name
名前」と呼ばれる属性/(テーブルの列) があることを意味します。フィールドのタイプによって、列のタイプを推測できます。例えば。この場合は文字列なので、おそらく VARCHAR(255) が適切です (Rails では文字列と呼ばれます)。
また、属性の名前に基づいて適切な型を推測する必要がある場合もあります (たとえば、:time のようなものが言及されている場合は、おそらく Time または DateTime 型のいずれかです)。
これにより、テーブル内の他のすべての属性が得られる場合があります。ただし、場合によっては、属性を見逃す可能性があります。コントローラーで他の属性への参照を見つけた場合。app/controllers/user_groups_controller.rb をテーブルに列として追加する必要があります。ただし、テストするときに属性が欠落している場合、関連するモデルのオブジェクトに対して NoMethodError がスローされるため、テストするときにこれを最後まで残すことができます。例えば。クラス UserGroup の @user_group 変数に title という名前のメソッドがないことが示されている場合は、文字列型の「title」という名前の列が欠落している可能性があります。
移行/データベースを再作成します
これで、データベース テーブルと列の名前と型がどうあるべきかがわかったはずです。
データベースの移行を生成/再作成する必要があります。
これを行うには、コマンドを使用するだけrails generate migration RecreateTables
です。
次に、でファイルを見つける必要がありますdb/migrate/???_recreate_tables.rb
。
内部では、Ruby コードを書き始めてテーブルを作成します。このリファレンスはhttp://guides.rubyonrails.org/migrations.htmlにあります。
しかし、本質的には、次のようなものになります。
class RecreateTables < ActiveRecord::Migration
def up
create_table :user_groups do |t|
t.string :name # adds a string (VARCHAR) column called "name"
t.text :description # adds a textarea type column called "description
t.timestamps # adds both "created_at" and "updated_at" columns for you
end
end
def down
drop_table :products # this is the reverse commands to undo stuff in "up"
end
end
Gemfile を再作成するには:
まず、デフォルトの Gemfile を追加します。これは、rails new testapplication
どこかを使用して空の Rails アプリケーションを作成することで実行できます。次に、Gemfile を実際のアプリケーションにコピーします。レールやその他の一般的な宝石を含めることから始めましょう。
どのgemが必要かを正確に判断するのは非常に困難です。最善の方法は、コードを調べながら、それらを 1 つずつ追加してみることです。
ここでも、MethodNotFound エラーはあなたの味方です。追加した gem に基づいてアプリケーションをテストすると、gem によって提供される可能性のある欠落しているメソッドが検出される場合があります。モデルに欠落しているいくつかのメソッドは、gem が欠落していることを示している可能性があります (または、データベース内のフィールド/列が欠落していることを示している可能性があります)。ただし、Controller または ActiveRelation クラスのメソッドが欠落している可能性は非常に高く、gem が欠落していることが原因です。
コードを調べて、追加する gem を推測する必要があります。
can
、 、のようなメソッドを使用しcan?
、ファイルがあるapp/models/ability.rb
場合は、 が必要gem 'cancan'
です。モデルを呼び出す場合はdevise
、 が必要gem 'devise'
です。多くの一般的な gem はhttp://ruby-toolbox.comで見ることができます。
Gemfile に gem を追加したら、bundle
再度テストする前に、コマンド ラインで実行して新しい gem をインストールする必要があります。再度テストするときは、テスト サーバーを再起動する必要があります。再bundle exec rails server
実行して、ローカル テスト サーバーlocalhost:3000
などを起動します。
から Rakefile をコピーするだけでrails new testapp
、必要なものがすべて含まれている可能性があります。
不足しているテスト
欠落している test/ ディレクトリは、実際のアプリケーションには関係ありません。アプリケーションを実行する必要はありません。ただし、アプリケーションをテストするための自動スクリプトは保持されます。アプリケーションを自動的にテストしたい場合は、新しいテストを書き直す必要があります。ただし、アプリケーションを元に戻す目的で、現時点では無視できます。
ベンダー ディレクトリがありません
いくつかの追加コードは、gem としてではなく、プラグインとしてインストールされます。vendor ディレクトリがない場合、プラグインとしてインストールされたものはすべて失われます。gem の場合と同様に、不足している可能性のあるプラグインを推測し、プラグインを再インストールするか、gem の代替品を使用して、不足しているプラグインを再ダウンロードすることをお勧めします。
その他のヒント:
使用されている宝石の名前を挙げている可能性のあるコメントをいくつか読んでみてください。
データベースのフィールド/列ではないと思われるメソッドまたはメソッドのセットが欠落している場合は、gem が欠落している可能性があります。最善の方法は、Google でこれらのメソッド名を検索することです。例えば。「paginate」が欠落している場合は、「rails paginate gem」を検索して、必要な可能性のある gem を確認できます。この例では、おそらく「will_paginate」と「kaminari」が思いつきます。次に、どの gem が必要かを試して推測する必要があります。コマンドラインで agrep will_paginate app -r
を実行して、ページネーションを使用しているかどうかを確認してください。grep コマンドは、「app」というディレクトリで文字列「will_paginate」を検索します。-r を指定すると、すべてのファイルに対してこれが再帰的に実行されます。