3

私の Rails アプリには、 と の 2 つのモデルが PersonありCompanyます。このオブジェクトの任意のペア間に多対多の関係を指定する必要があります。だから私はこのようにすることができるはずです:

@connections = @person.connections

ここではandオブジェクト@connectionsの配列です。PersonCompany

現在ConnectionBinding、このためのモデルを作成しましたが、期待どおりに機能しません:

class ConnectionBinding < ActiveRecord::Base
  belongs_to :connect_from, polymorphic: true
  belongs_to :connect_to,   polymorphic: true
end

それはActiveRecord::HasManyThroughAssociationPolymorphicSourceError例外だと思います

誰かがすでにこの問題を解決していますか? 任意の提案をいただければ幸いです。

4

3 に答える 3

7

探している関連付けられた列を ActiveRecord に伝える必要があります。私はあなたが次のものを持ちたいと思っていると思います:

class Person < ActiveRecord::Base
  has_many :connection_bindings
  has_many :companies, :through => :connection_bindings
  has_many :people, :through => :connection_bindings
end

class company < ActiveRecord::Base
  has_many :connection_bindings
  has_many :companies, :through => :connection_bindings
  has_many :people, :through => :connection_bindings
end

問題は、ID を 1 つの列に入れる 2 つのテーブルがあり、Rails がどのテーブルを検索すればよいか分からないことです。

たとえば、データベース内の特定の connection_binding 行では、connect_from は company_id または person_id のいずれかであり、connect_to についても同じことが当てはまります。だからあなたはこう言います:「ヘイ、Rails、私の関連付けられた ConnectionBindings を読み込んでください」と、connect_from が 11 で connect_to が 12 である行を取得します。言う方法はありません!

代わりに、Rails にさらに情報を提供する必要があります。

class Person < ActiveRecord::Base
  has_many :connection_bindings
  has_many :person_connections, :through => :connection_bindings, :source => :to_connect, :source_type => 'Person'
  has_many :company_connections, :through => :connection_bindings, :source => :to_connect, :source_type => 'Company

  def connections
    person_connections + company_connections
  end
end

反対側 (および関連する :from_connect のもの) でそれを構築する必要がありますが、これらの接続をどのように使用しているかによって異なります。始めるには十分なはずです。

これは、Ruby と Rails の魔法の世界で慣れ親しんでいるよりもはるかに多くのタイピングですが、作成しようとしているのは非常に複雑なデータ パターンです。これは、それが不可能だという意味ではありません – 優れたフレームワークである Rails は、あなたが本当にやりたいことを止めることはありません – しかし、それはあまり一般的ではなく、あなたの側でいくらか明示する必要があります.

于 2013-03-12T17:03:13.443 に答える
2

アイデアを示してくれたクリスに感謝します。しかし、これを機能させるには、いくつかの変更を加える必要があります。クリスの例の問題は、メソッドを呼び出すと、person_connections間違ったクエリが生成されることです。

Person.find(720).person_connections

この SQL を生成します

SELECT  "people".* FROM "people"
INNER JOIN "connection_bindings"
  ON "people"."id" = "connection_bindings"."connect_to_id"
WHERE "connection_bindings"."person_id" = 720
  AND "connection_bindings"."connect_to_type" = 'Person'

そのperson_id列は である必要がありますconnect_from_id。したがって、ActiveRecord がポリモーフィックな関連付けであることを示す:as => :connect_fromオプションを追加する必要があります。has_many :connection_bindings

has_many :connection_bindings, :as => :connect_from
has_many :person_connections,  :through => :connection_bindings,
  :source => :connect_to, source_type: 'Person'
has_many :company_connections, :through => :connection_bindings,
  :source => :connect_to, source_type: 'Company'

しかし、それでも十分ではありません。逆接続を取得できる必要があります。したがって、 Person@aに接続を追加すると、 Person @b? method connections は、その接続を両方向@a.connectionsとで表示する必要があり@b.connectionsます。

そして今、いくつかの関連付けと集計メソッドを追加することで、これを行うことができると思います。

于 2013-03-13T01:13:39.243 に答える
0

懸念事項:

module Linkable
  extend ActiveSupport::Concern

  included do
    has_many :links_to, as: :linkable_to, class_name: 'Link' # [this]->[other object]
    has_many :links_from, as: :linkable_from, class_name: 'Link' # [other object]->[this]
  end
end

リンク テーブル:

class Link < ActiveRecord::Base

  #The idea for this class is to by a double polymorphic table, linking an object to another object
  belongs_to :linkable_from, :polymorphic => true
  belongs_to :linkable_to, :polymorphic => true
end
于 2013-11-15T19:51:17.813 に答える