1

これは少し注意が必要です。さらに情報が必要な場合は、遠慮なく!

私には2つのモデルがStoreあり、Consumerそれは2つの方法でリンクされています。

1 /StoreConsumer同じモデルから継承しProfileます。これは、多くの属性(名前、場所、電子メール、Webページなど)を共有しているためです。RailsのARコードは次のとおりです。

class Profile << ActiveRecord::Base
    # Attributes and validation rules go here.
end

class Store << Profile
end

class Consumer << Profile
end

これはよく知られている単一テーブル継承(STI)です。

Store2 / STIに加えてConsumer、多対多の関係によってリンクされています。

  • ストアには多くのクライアント(多くの消費者)がいます

  • 消費者は多くの店舗のクライアントです

このリンク(ストア-コンシューマー)にはさらに多くの属性が必要なため、それらをリンクする追加のモデルを作成する必要がありますClient

これが私の最終的なARモデルです。

class Profile << ActiveRecord::Base
    # Attributes and validation rules go here.
end

class Store << Profile
    has_many :clients
end

class Consumer << Profile
    has_many :clients
end

class Client << ActiveRecord::Base
    belongs_to :store
    belongs_to :consumer
end

問題

STIを使用してもstore_idとconsumer_idは作成されません...profile_idしかありません(実際のテーブルが1つあるためProfile)。Clientでは、 store_idとclient_idの両方を持つ正しい行をターゲットにするにはどうすればよいですか?

それを行う方法はありますか?前もって感謝します。

4

1 に答える 1

3

やりたいのはこんな感じだと思います。また、ダニエル・ライトのコメントにも同意します。

class Profile << ActiveRecord::Base
    belongs_to :store
    belongs_to :consumer
end

class Store << ActiveRecord::Base
    has_one :profile
    has_many :clients
    has_many :consumers, :through => :clients
end

class Consumer << ActiveRecord::Base
    has_one :profile
    has_many :clients
    has_many :stores, :through => :clients
end

class Client << ActiveRecord::Base
    belongs_to :store
    belongs_to :consumer
end

しかし、あなたが持っているものでそれを機能させたいのなら、あなたは次のようなことをすることができます:

class Profile << ActiveRecord::Base

end

class Store << Profile
    has_many :clients, :foreign_key => 'store_id'
    has_many :consumers, :through => :clients
end

class Consumer << Profile
    has_many :clients, :foreign_key => 'consumer_id'
    has_many :stores, :through => :clients
end

class Client << ActiveRecord::Base
    belongs_to :store
    belongs_to :consumer
end
于 2012-10-03T14:50:47.433 に答える