8

こんにちは、私のプロジェクトには興味深い要件があります。has_oneどちらか一方のクラスであるが、継承のない関係が必要です。それが唯一の方法であれば、継承を回避できますが、2 つの関連付けられたレコードは完全に異なるデータを持ち、まったく関連していません。

私が把握する必要があるのは、次のようなものです。

# 1. Foo never belongs to anything.
# 2. Foo MUST have one assigned sub-record for validity.
# 3. Foo can only have either Bar or Baz assigned.
# 4. Bar and Baz have only ONE common property, and aren't
#    related in either data or implementation.

class Foo < ActiveRecord::Base
  # Attributes: id, name, value
  has_one :assignment, :foreign_key => 'assigned_to', :readonly => true
          # Could really use an :object_type for has_one here...
end

class Bar < ActiveRecord::Base
  # Attributes: name,...
end

class Baz < ActiveRecord::Base
  # Attributes: name,...
end

または のいずれかFooのタイプの 1 つの割り当てがあります。それらは共通の列を 1 つしか共有しないので、おそらくそこから親オブジェクトを作成できます。ただし、共通のオブジェクトから継承する場合 (実際に含まれるデータがオレンジとリンゴである場合)、レコードのテーブルを作成する必要がありますか? レコードが抽象的なレコードであるが、子レコードがそうでない場合、おそらくそれを回避できますか?BarBaz

ここまで来れば私の難しさはお分かりいただけると思います。私は RoR にかなり慣れていませんが、これまでのところ気に入っています。これを回避する方法があると確信していますが、それが何であるかを理解できない場合は気が遠くなるでしょう。

4

2 に答える 2

8

リレーショナル データベースのパラダイムに適合しないものをモデル化しようとしています。SQL のすべての参照には、1 つの起点と 1 つのターゲットがあります。

FWIW、Polymorphic Associations もこの規則に違反しているため、アンチパターンです。ドキュメントに参照整合性制約を無視して機能させる必要があると書かれている場合、それは壊れた設計であるという手がかりになるはずです!

has_oneFoo に 2 つの関係を持たせる必要があります。1 つは Bar に、もう 1 つは Baz にします。次に、いくつかのクラス ロジックを実装して、Foo の任意のインスタンスに 1 つの参照のみが設定されるようにします。つまり、Bar と Baz への参照のうち、一方は値を持ち、もう一方は nil でなければなりませんが、これはコードでチェックして適用するものです。

于 2008-12-17T16:38:04.307 に答える
0

おそらく、これを行う 1 つの方法は、Bar と Baz のために、Foo で has-one 関連付けを作成することです。次に、Bar と Baz にアクセスする唯一の方法となる、assignment と assignment= というメソッドを作成します。get メソッドで 2 つの has_ones のどちらが nil でないかを確認し、それを返すことができます。割り当てメソッドでは、渡された変数の型を確認し、そのオブジェクトに正しい has-one 関係を設定し、もう一方を nil に設定できます。複雑になりすぎずに、すべてのベースをカバーする必要があります。

于 2008-12-17T16:31:39.547 に答える