Rails のポリモーフィックな関連付けを少し変わった方法で使用しようとしていますが、問題が発生しています。
ポリモーフィック テーブルは、Address
class Address < ActiveRecord::Base
belongs_to :addressable, polymorphic: true
end
同じアドレス アドレスの関連付けを 2 回追加できないように、データベースに一意性制約があります。
Trip
2 つのアドレスが必要なモデルもあります。1 つは旅行の出発地であり、もう 1 つは旅行の目的地です。
class Trip < ActiveRecord::Base
has_one :origin, as: :addressable, class_name: 'Address'
has_one :destination, as: :addressable, class_name: 'Address'
end
問題は、Rails が旅行に関連付けられた住所を作成するときに、クラス名 (「Trip」) を使用してaddressable_type
列に入力することです。つまり、出発地と目的地で旅行をしようとすると、レールは同じaddressable_type
とで 2 つの行を追加しようとしaddressable_id
ます。これは明らかに一意性制約で失敗します。
一意性制約を削除することはできますが、レコードが重複してしまい、Rails が混乱することになります。これは、どのレコードが起点で、どのレコードが宛先であるかがわからないためです。
私が本当にやりたいことは、使用する文字列を指定することですaddressable_type
:
class Trip < ActiveRecord::Base
has_one :origin, as: :addressable, class_name: 'Address', type: 'Trip Origin'
has_one :destination, as: :addressable, class_name: 'Address', type: 'Trip Destination'
end
それは可能ですか?別の解決策はありますか、それともデータベース スキーマを再考する必要がありますか?