4

更新:質問はまだ開いています、レビュー、コメントはいつでも歓迎です

いくつかの重要なファイルとディレクトリが欠落している既存のRailsプロジェクトがあります。

プロジェクトレールバージョン(2.3.8)environment.rbで見つけました

現在私が持っているのは

app
   controllers (already fully coded)
   helpers  (already fully coded)
   models (already fully coded) 
   reports (already fully coded)
   views  (already fully coded)

config ---> default configurations (already fully coded)
lib ---> contains nothing
public --> contains images and scripts (already fully coded)
script ---> contains server,runner,plugin,dbconsole....

appディレクトリにはコードの動作状態が完全に含まれています。app/modelには100を超える.rbファイルが含まれているため、100を超えるテーブルになると思います。

主に不足しているものは、dbディレクトリ、.gemファイル、rakeファイル、doc、test、vendor、database、schema.rb、および移行です。

注: そのプロジェクトのテーブルスキーマとデータベースがありません

モデルとビューからテーブルまたは完全なデータベースを生成する必要があり、モデルまたはビューからdbスキーマを生成するためのリバースエンジニアリングのようなものを探しています

私はRailsの初心者であり、Javaのバックグラウンドを持っています。Javaでは、Hibernateを使用してデータベースオプションへのpojo(Railsのモデル)が利用可能です。Rails用の同様の種類のものを探しています。私の主な目的はそのプロジェクトを実行することです。 、だからみんな助けてください。

4

3 に答える 3

4

データベース スキーマを再作成するには、かなりの時間がかかります。

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 を指定すると、すべてのファイルに対してこれが再帰的に実行されます。

于 2012-09-02T03:59:33.170 に答える
2

以下では、次の方法をすでに知っていることを前提としています。

  • データベース スキーマを SQL ファイルにダンプする
  • Rails コンソールを起動します ( rails c)
  • Rails マイグレーションを生成する

これが私があなたがすべきだと思うことです。

  1. どのクラスが物理テーブルに対応するかを特定します (質問でいくつかのビューについて言及しているため、モデルのサブセットが実際のテーブルではなくデータベース ビューにバインドされていると思われます)。CREATE TABLEこれを行うには、モデル (ActiveRecord::Base を拡張するクラス) の定義をスキーマ ダンプ内のステートメントと一致させる必要があります。たとえばclass Person、Ruby コードでCREATE TABLE peopleは、DB スキーマ ダンプと一致します。

  2. これらのモデル (クラス名) を特定したら、Rails コンソールを起動し、それらのモデル名を 1 つずつ入力して、Enter キーを押します。Person というモデルのコンソール出力は、おそらく次のようになります。

>> Person
=> Person(id: integer, first_name: string, last_name: string)

次に、括弧内の内容を取得し、先頭id: integer,の を取り除き、コンマを取り除き、コロンの後の空白を取り除くと、次のようになります。

first_name:string last_name:string

これを行うと、移行を生成するコマンドは次のようになります。

rails g migration Person first_name:string last_name:string

次に、別の場所で新しい Rails プロジェクトを開始し、これらすべての移行を実行して、db/migrate. 移行はおそらく 90% 完了しています。まだ行う必要があるのは、のいくつかのインスタンスを に置き換えることt.integert.references、完全にドメイン固有であり、一般的な回答でキャプチャすることが不可能なその他のマイナーなことです。

HTH。

于 2012-09-02T09:09:48.390 に答える
2

Rails はフルスタックの Web フレームワークですが、必要に応じて一部のパーツがなくても機能します。

例:あなたの場合

db - DB /テーブルを作成するための移行を保持するためのディレクトリがありますが、レガシーDBを使用している場合、またはデータベースがDB管理者によって処理されている場合は、必要ないかもしれません. (database.yml ファイル経由で DB に接続できます)

Gem ファイルは、Maven (Java) で行うように、すべての gem (ライブラリ) を 1 か所に保持するのに役立ちます。

test、もう一度テストケースを作成した場合(これは絶対に悪い考えです)、これが必要です

vendorはサードパーティのプラグイン用で、doc はドキュメント用です。同じルールが適用されます。必要な場合はスキップできます

「Activerecord」と呼ばれるレールでの休止状態、同じ概念、モデルはデータベーステーブルにバインドされます(技術的にモデルはテーブル内の生を表します)

したがって、本当に追加したい場合は追加しますが、放置しない場合はそのままにしておきます

しかし、適切なGemファイルとテストケースを持つことは必須だと思います

Railsへようこそ

HTH

于 2012-07-31T14:34:28.847 に答える