2

例として Stackoverflow を取り上げます。

2 つのモデル: 質問とタグ

質問には多くのタグを付けることができます。

関連付けを管理するために別のテーブル「Question_tags」を作成する必要がありますか、または質問テーブルに配列フィールドを作成する方法があります。

どちらが良いですか?専用の「Question_tags」テーブルはやり過ぎでしょうか?

4

1 に答える 1

4

Array of Hash のようなシリアル化された属性の代わりに、Tag モデルを使用することを強くお勧めします。

モデルははるかに柔軟です。将来的には、検索機能、カスタム順序付け、表記など、タグに関する新しい機能を追加する必要があるかもしれません。シリアライズされた属性を使用すると、このようなことを行うのは難しくなります。

タグ「 hello-world 」を持つすべての質問を見つけたいと想像してくださいTag.where(name: 'hello-world').first.questions。関連する質問を単純に取得するのではなく、このタグを持つすべての質問を取得するには、複雑な SQL クエリを作成する必要があります。

また、タグ モデルをポリモーフィックにすることもできます。これにより、「タグ付け可能」と定義したすべてのオブジェクトにタグを割り当てることができます。


モデルで関連付けを定義するには:

class Question < ActiveRecord::Base
  has_many :question_tag_relations
  has_many :tags, through: question_tag_relations

class Tag < ActiveRecord::Base
  has_many :question_tag_relations
  has_many :questions, through: question_tag_relations

class QuestionTagRelation < ActiveRecord::Base
  belongs_to :question
  belongs_to :tag
  validates :question_id, presence: true # optionnal
  validates :tag_id, presence: true # optionnal

question_tag_relations テーブルを作成するには、対応する移行を生成する必要があります。

于 2013-10-02T14:56:55.880 に答える