3

Ruby on Railsガイドと多態性関連に関する質問へのstackoverflowレスポンスのいくつかを読んだ後、その使用と実装について理解していますが、特定の使用シナリオについて質問があります。私は(もtagsを変化している)複数topicscategoriesimagesと他の様々なモデルに関連付けられているが、代わりにtagsテーブル内の参照フィールド(foreign_idforeign_type)を配置することができるtagsを持って、私は別を作成することを好むだろう関連テーブル。 :polymorphic => trueを使用してもこれは可能ですか?このような別個のポリモーフィックアソシエーションテーブル

何か:

create_table :tags do |t| 
    t.string :name 
    t.remove_timestamps 
end 

create_table :object_tags, :id => false do |t| 
    t.integer :tag_id 
    t.references :tagable, :polymorphic => true 
    t.remove_timestamps 
end 

これが不可能な場合は、私は同じ:object_tagsテーブルを作成し、関連付けを強制的にTagモデルと他のモデルの中:conditionsを使用して計画されました。これを行う方法はありますか?ありがとう! (レール3.0.9 &ルビー1.8.7 <での作業 - デプロイメント・サーバは、まだ1.8.7を使用しているため)

UPDATE: おかげDELBA! Answerは、HABTM多型の実用的な解決策です。

class Tag < ActiveRecord::Base 
    has_many :labels 
end 

class Label < ActiveRecord::Base 
    belongs_to :taggable, :polymorphic => true 
    belongs_to :tag 
end 

class Topic < ActiveRecord::Base 
    has_many :labels, :as => :taggable 
    has_many :tags, :through => :labels 
end 

create_table :tags, :timestamps => false do |t| 
    t.string :name 
end 

create_table :labels, :timestamps => false, :id => false do |t| 
    t.integer :tag_id 
    t.references :taggable, :polymorphic => true 
end 

UPDATE:私は双方向のHABTMを必要とするので、私は戻って個々のテーブルを作成しようとしてしまいました。

+0

なぜこのようにしたいですか? (純粋な好奇心、判断なし) – Damien

+0

モデルの関連ごとに別個のテーブルを作成するのではなく、 'Tag'に利用可能なすべての関連付けを持つ単一のテーブルを持つほうが効率的です。現時点では、個々の関連付けテーブルを使って設定しています。あなたの質問に答える私は本当にこの種の解決の必要性はないと認識しています。私が探しているセットアップの種類は、右のより多くのメモリを使用するだろうか? –

+1

私は今でも意見の初めさえ持っていません。私は、多形的なやり方をするための道があるとは思わないが、明日は確かに試してみる。素晴らしい質問。アップアップされました!編集:それはあなたの質問にすることがありますが、私は答えがわからない:http://stackoverflow.com/questions/6964678/habtm-polymorphic-relationship – Damien

答えて

1

はい、タグ付きの列をタグに追加することはできません。その逆もあります。あなたはHABTについて言及しましたが、has_and_belongs_to、:polymorphic => trueのようなことは私が知る限り行うことはできません。

create_table :object_tags, :id => false do |t| 
    t.integer :tag_id 
    t.integer :tagable_id 
    t.string :tagable_type 
end 

他のテーブルには、object_tags、タグ、またはタグ可能な列は必要ありません。

class Tag < ActiveRecord::Base 
    has_many :object_tags 
end 

class ObjectTag < ActiveRecord::Base 
    belongs_to :tagable, :polymorphic => true 
    belongs_to :tag 
end 

class Topic < ActiveRecord::Base 
    has_many :object_tags, :as => :tagable 
    has_many :tags, :through => :object_tags 
end