例として Stackoverflow を取り上げます。
2 つのモデル: 質問とタグ
質問には多くのタグを付けることができます。
関連付けを管理するために別のテーブル「Question_tags」を作成する必要がありますか、または質問テーブルに配列フィールドを作成する方法があります。
どちらが良いですか?専用の「Question_tags」テーブルはやり過ぎでしょうか?
例として Stackoverflow を取り上げます。
2 つのモデル: 質問とタグ
質問には多くのタグを付けることができます。
関連付けを管理するために別のテーブル「Question_tags」を作成する必要がありますか、または質問テーブルに配列フィールドを作成する方法があります。
どちらが良いですか?専用の「Question_tags」テーブルはやり過ぎでしょうか?
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 テーブルを作成するには、対応する移行を生成する必要があります。