分離された多数のエンジンを実装するRailsプロジェクトがあります。
- プライマリエンジン(常にそこにあります)
- 拡張エンジン#1(プライマリエンジンを拡張するオプションのプラグイン)
- 拡張エンジン#2(プライマリエンジンを拡張するオプションのプラグイン)
- 等。
ロングストーリー-ショート、プライマリエンジンのモデルに関係のあるモデルを追加するには、拡張エンジンが必要です。
拡張機能は他のエンジンの物理テーブルを変更すべきではありませんが、拡張機能がプライマリエンジンのテーブルを参照するための結合テーブルとして機能する独自のテーブルを作成できなかった理由はありません。
簡単にするために、以下に私がやろうとしていることを示します。
プライマリエンジン
... / app / models / models / user.rb
module PrimaryEngine
User < ActiveRecord::Base
End
end
車両エンジン
# .../vendor/engines/vehicle_engine/app/models/vehicle.rb
module VehicleEngine
Vehicle < ActiveRecord::Base
End
end
# .../vendor/engines/vehicle_engine/config/initializers/user_extension.rb
...
PrimaryEngine::User.class_eval do
has_one :vehicle, :through => :vehicle_engine_users_vehicles
end
...
結合テーブルを使用する必要がある唯一の理由は、プライマリエンジンの primary_engine_user
テーブルを変更できない(すべきではない)ためです。primary_engine_user
通常、テーブルに新しい列を追加するだけですprimary_engine_user.vehicle_id
。
:through =>
重要なのは、その結合テーブルには機能を公開する必要があるものが何もないため、パーツのモデルを作成する必要がないということです。
CREATE TABLE vehicle_engine_users_vehicles
(
primary_engine_user_id integer NOT NULL,
vehicle_id integer NOT NULL
)
結合テーブルが推測されますが、指定する必要がない、のhas_one
ように機能する方法があるかどうか疑問に思っています。has_and_belongs_to_many
ありがとう!
明確化の更新:
APrimaryEngine::User
は1台の車両を持つことがVehicleEngine::Vehicle
できますが、多くの異なるユーザーを持つことができます。