4

Rails 3.1エンジンは独自のデータベースを持ち、同時にユーザー認証などのためにメインアプリのデータベースにアクセスできますか?可能であれば、これをどのように構成できますか?

ありがとう

4

3 に答える 3

5

はい、できます。別のsqlite3データベースを使用するエンジンを構築しました。このようにして、すべてのエンジンの機能とデータが分離されます。エンジンを削除し、データベースを削除すると、痕跡を残さずにすべてが失われます。

まず、マウント可能なエンジンを生成することをお勧めします。これにより、名前空間が作成され、エンジンがメインアプリから分離されます。これは必須ではありませんが、ベストプラクティスです。次の例で完了したと思います。

ある時点で、エンジン内にモデルを生成します。エンジンルートパスに、次のように入力します。

$ rails generate resource Post

これにより、Postコントローラー、モデル、およびルートが生成されます。データベースの移行を除いて、すべてが完璧です。これを削除します。データを分離したい場合、この移行は役に立ちません。エンジン内での移行の唯一の目標は、それらをメインアプリのデータベースにコピーすることです。だから先に進んでそれを取り除きます:

$ rm -r db

次に、通常どおり、ルートルートとコントローラーを接続します。

別のデータベースに接続するために、モデル内で行う変更がもう1つあります。

module YourEngine
  class Post < ActiveRecord::Base
    establish_connection :adapter => 'sqlite3', :database => 'db/your_engine.sqlite3'
  end
end

このように、エンジンのモデルはメインデータベースを使用せず、定義したデータベースを使用します。理解するための鍵は、データベースファイルがエンジン内に存在しないことです。このデータベースファイルは、ホストアプリケーション内にあります。すべてを個別に保持しているため、このデータベースを手動で作成する必要があります。sqlite3コマンドラインツールと手作りのcreateステートメントを使用するのが最も簡単です。

$ cd "the root dir of the host rails app"
$ sqlite3 db/your_engine.sqlite3

テーブルを作成する場所から:

CREATE TABLE your_engine_posts (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name varchar(255) NOT NULL DEFAULT '', body text, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL);

プレスト!これで、アプリ内にエンジンをマウントして起動するだけで、すべての準備が整います。明らかに、エンジンに別のデータベースがあるので、移行を操作しても意味がありません。スキーマを手動で更新する必要があります。

于 2012-07-06T15:21:01.583 に答える
1

テーブル名がアプリと競合することが心配な場合は、「isolate_namespace」メソッドを使用できます。これにより、すべてのテーブル名の前にエンジンの名前空間が追加されます。

Rails Casts には、これを使用する優れたチュートリアルがありました。チェックしてみてください。

http://railscasts.com/episodes/277-mountable-engines

于 2011-08-03T05:46:01.150 に答える
0

はい、できます。これに関するガイドをここに書きました http://railsforum.com/viewtopic.php?id=42143

于 2011-08-03T05:54:40.317 に答える