3

Rails のポリモーフィックな関連付けを少し変わった方法で使用しようとしていますが、問題が発生しています。

ポリモーフィック テーブルは、Address

class Address < ActiveRecord::Base
  belongs_to :addressable, polymorphic: true
end

同じアドレス アドレスの関連付けを 2 回追加できないように、データベースに一意性制約があります。

Trip2 つのアドレスが必要なモデルもあります。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

それは可能ですか?別の解決策はありますか、それともデータベース スキーマを再考する必要がありますか?

4

1 に答える 1

2

1つの住所が複数の旅行の出発地および/または目的地である可能性があるため、旅行でaddressはないと思いました。belongs_toこれは、一意性の制約がある場合に特に当てはまります。外部キーはトリップに保存する必要があります。

class Address < ActiveRecord::Base
  has_many :trips_as_origin, class_name: "Trip", foreign_key: "origin_id"
  has_many :trips_as_destination, class_name: "Trip", foreign_key: "destination_id"
end

class Trip < ActiveRecord::Base
  belongs_to :origin, class_name: "Address"
  belongs_to :destination, class_name "Address"
end

origin_idおよびdestination_idを追加する移行を作成する必要がありますTrip

于 2012-07-17T12:44:00.323 に答える