複数の値を 1 つの列に格納したくなる一方で、誰かが怪我をする結果になります。モデルを関連付けるために結合テーブルを作成することをお勧めします。
たとえば、これを行うことができます:
class DiscussionThread < ActiveRecord::Base
has_many :participations
has_many :participants, :through => :participations
end
class Participation < ActiveRecord::Base
belongs_to :discussion_thread
belongs_to :participant, :class_name => "User", :foreign_key => :user_id
end
class User < ActiveRecord::Base
has_many :participations
has_many :dicussion_threads, :through => :participations
end
これにより、次の 3 つのテーブルが得られます。
table: discussion_threads
columns: id
table: participations
columns: id | discussion_thread_id | user_id
table: users
columns: id
ユーザーが参加しているスレッドを見つけるには、次のようにします。
@user.discussion_threads
スレッドに参加しているユーザーを見つけるには:
@discussion_thread.participants
注:Thread
は Ruby の予約語なので、名前を変更しましたDiscussionThread
編集
ID の配列をシリアル化し、それらに対してクエリを実行する方法の例を示してもよろしいですか?
あなたは真夜中に目覚め、奇妙な衝動に駆られてコンピューターに行き、この移行を作成します。
rails g model Abomination horror_ids:text
およびモデル:
class Abomination < ActiveRecord::Base
serialize :horror_ids
end
それをテストして、配列を格納できることを確認します。
@abomination = Abomination.create(:horror_ids=>[2,33,42])
@abomination.horror_ids # => [2,33,42]
だから何?Rails が舞台裏でこれを YAML に変換することはご存知でしょう。これは次のようになります。
---\n
- 2\n
- 33\n
- 42\n
再びその奇妙な衝動に駆り立てられて、「この列に保存されている特定の ID をどのように検索できますか?」と疑問に思うでしょう。まあ、それはただの文字列ですよね?テキストフィールドでそれを見つける方法を知っています:
cthulhu = 33
Abomination.where(["horror_ids LIKE '%- ?\n%'",cthulhu]).first
恐怖が増すにつれて、誰かがこれに出くわし、それが実際には良い考えだったと思うかもしれないことに気づきます. 破壊しなければなりません!しかし、あなたはタイプすることができませrm -rf *
ん.
@abomination = Abomination.create
@abomination.horror_ids # => nil
@abomination = Abomination.create(:horror_ids=>[])
@abomination.horror_ids # => []
@abomination = Abomination.create(:horror_ids=>"any string value can go here")
@abomination.horror_ids # => "any string value can go here"
また、列のサイズが小さすぎてすべてを収容できない場合、シリアル化されたデータが破損する可能性があるという事実。
あなたは電源コードを追い出すために最後の溝の努力をしますが、それは遅すぎます. 最後に、あなたは眠りに落ちます。翌日、自分が犯したことに気づき、コーディングを永遠にあきらめ、会計士になります。
道徳の
これをしないでください