Rails 3.1エンジンは独自のデータベースを持ち、同時にユーザー認証などのためにメインアプリのデータベースにアクセスできますか?可能であれば、これをどのように構成できますか?
ありがとう
Rails 3.1エンジンは独自のデータベースを持ち、同時にユーザー認証などのためにメインアプリのデータベースにアクセスできますか?可能であれば、これをどのように構成できますか?
ありがとう
はい、できます。別の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);
プレスト!これで、アプリ内にエンジンをマウントして起動するだけで、すべての準備が整います。明らかに、エンジンに別のデータベースがあるので、移行を操作しても意味がありません。スキーマを手動で更新する必要があります。
テーブル名がアプリと競合することが心配な場合は、「isolate_namespace」メソッドを使用できます。これにより、すべてのテーブル名の前にエンジンの名前空間が追加されます。
Rails Casts には、これを使用する優れたチュートリアルがありました。チェックしてみてください。
はい、できます。これに関するガイドをここに書きました http://railsforum.com/viewtopic.php?id=42143