3

Ruby on Rails のガイドと、ポリモーフィック アソシエーションに関する質問に対するスタック オーバーフローの回答をいくつか読んだ後、その使用と実装は理解できましたが、特定の使用シナリオについて質問があります。複数の、、およびその他のさまざまなモデル (さまざまな もあります)tagsに関連付けることができますが、参照フィールド ( 、) をテーブル内に配置する代わりに、別の関連付けテーブルを作成することをお勧めします。これはまだ使用できますか?topicscategoriesimagestagsforeign_idforeign_typetags: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テーブルを作成し、モデル内および他のモデル:conditions内で使用して関連付けを強制することを計画していました。Tagこれを行うレールの方法はありますか?ありがとう!(rails 3.0.9 & ruby​​ 1.8.7 で動作 <-デプロイメント サーバーがまだ 1.8.7 を使用しているため)

更新: ありがとうデルバ! 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

更新:双方向の HABTM が必要なため、個々のテーブルの作成に戻りました。

4

1 に答える 1

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、tags、またはtagableの列は必要ありません。

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
于 2011-12-09T00:00:05.997 に答える