0

私のアプリケーションには、7 つのモデルがあります。ユーザーが 2 つの異なるタイプのタグを使用して、3 つの異なるモデルに何度もタグ付けできるようにしたいと考えています。ユーザーは、これらすべてのモデルにも属しています。

User

2 つのタグ モデルはDogCat

タグを持つことができる 3 つのモデルはStore、、、FarmHouse

結合テーブルを作成するためのTaggingモデルがあるので、猫を店、農場、または家に割り当てることができるようにしたいので、多対多です。

以下にあるものがこのシナリオの正しい方法であるかどうかを知りたいと思いました。Taggingの種類ごとに結合テーブルを 1 つ持つか、別のテーブルを作成する必要がありTagますか? それは犬と猫ですか?

class User < ActiveRecord::Base
  has_many :dogs
  has_many :stores
  has_many :houses
  has_many :farms
  has_many :cats
  has_many :taggings
end

class Dog/Cat < ActiveRecord::Base
   belongs_to :user
   has_many :taggings
   has_many :houses, :through => :taggings, :source => :taggable, :source_type => "House" 
   has_many :farms, :through => :taggings, :source => :taggable, :source_type => "Farm" 
   has_many :stores, :through => :taggings, :source => :taggable, :source_type => "Store" 
end

class House/Farm/Store < ActiveRecord::Base
  belongs_to :user
  has_many :taggings
  has_many :dogs, :through => :taggings, :source => :taggable, :source_type => "Dog" 
  has_many :cats, :through => :taggings, :source => :taggable, :source_type => "Cat" 
end

class Tagging < ActiveRecord::Base
  attr_accessible :taggable_id, :taggable_type
  belongs_to :dog
  belongs_to :cat
  belongs_to :user
  belongs_to :taggable, :polymorphic => true
end

# Tagging Table

create_table :taggings do |t|
   t.integer :dog_id
   t.integer :cat_id
   t.integer :user_id
   t.integer :taggable_id
   t.string  :taggable_type
end
4

1 に答える 1

1

あなたのデザインについてのいくつかの考え

ユーザーがタグを所有する必要があるのはなぜですか?

タグの本当の所有者は動物のようです。また、動物はユーザーが所有しているため、ユーザーをタグに関連付けるのは冗長に思えます。

タグは犬や猫のものではなく、動物のものです。

タグは猫か犬のどちらかしか所有できないため、両方を外部キーとして参照するのは直感的ではないようです。後でうさぎを追加する場合、別の関連付けを作成しますか? タグが動物に属するポリモーフィック ソリューションを検討します。これにより、猫と犬の両方に属する 1 つのタグの懸念が自動的に解消されます。

于 2013-06-23T14:43:48.380 に答える