1

テーブルを作成し、Rails 3 でそのテーブルからデータを取得するのに助けが必要です。

内訳は次のとおりです。

モデル - ここに含まれる 3 つのモデルは次のとおりです。

  • スレッドには多くの参加者がいます
  • 参加者の所属スレッド
  • ユーザー

活動表:

id | thread_id | participants

レコードの例は次のようになります。

1 | 300 | 3,1,5,67,13
2 | 333 | 3,12
3 | 433 | 1,12
4 | 553 | 1,12, 67

参加者は user_ids のリストです。user_ids を保存するより良い方法があれば教えてください。私はまだこれを構築していません。

アクティビティ テーブルにデータを入力した後。次に、次の行に沿ってクエリを実行できるようにしたいと考えています。

上記が明確であることを願っています。そうでない場合はお知らせください。アイデア?考え?提案。

ありがとう

4

1 に答える 1

5

複数の値を 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"

また、列のサイズが小さすぎてすべてを収容できない場合、シリアル化されたデータが破損する可能性があるという事実。

あなたは電源コードを追い出すために最後の溝の努力をしますが、それは遅すぎます. 最後に、あなたは眠りに落ちます。翌日、自分が犯したことに気づき、コーディングを永遠にあきらめ、会計士になります。

道徳の

これをしないでください

于 2011-02-10T06:17:54.800 に答える