2011-12-06 7 views
5
私は、次の2つのモデルを持っている

をねじ込み。Railsはプライベートメッセージ

私の 'index'コントローラのアクションでは、送信されたメッセージと受信したメッセージの両方をどのようにクエリしますか?たとえば、User1が '/ users/2/messages /'にヒットした場合、user1とuser2の間の会話全体が表示されます(最初のメッセージの送信者に関係なく)。私は 'スレッド'モデルを追加する必要がありますか、それとも私の現在の構造でこれを達成する方法がありますか?

ありがとうございました。

答えて

16

チェーン内の一連の相互接続されたメッセージよりも、参加できる会話としてこれを再構成する方がよい場合があります。例えば:

class Conversation < ActiveRecord::Base 
    has_many :messages 
    has_many :participants 
    has_many :users, :through => :participants 
end 

class Message < ActiveRecord::Base 
    belongs_to :conversation 
end 

class Participant < ActiveRecord::Base 
    belongs_to :conversation 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :conversations 
    has_many :participants 
end 

メッセージを誰かに送信され、そのための会話を作成し、usersリストに追加することによって、適切な関係者を招待します。

メッセージの親子関係や祖先を使用して、スレッド型メッセージングを追加することもできますが、実際にはほとんどの人には通常、単純な時間順の返信で十分です。

読み取り/未読の状態を追跡するには、ユーザーとメッセージの間の関連付けテーブルが直接必要です。これは難しい場合がありますので、必要がない限り避けてください。

いくつかの名前はRubyまたはRailsによって予約されており、Threadはその1つであるため、その名前のモデルを持つことはできません。

+1

これを見つけたときに2人のユーザー間で簡単な会話をする方法を探していました。それはうまくいくように見えます。ありがとう!しかし、それは、ユーザーモデルの「has_many:conversations、:through =>:participants」であってはなりませんか? – Vickash

+1

Userモデルの欠落している ':through'についてあなたは正しいです。 'has_many:participants'も持っているはずです。 – tadman

+0

私のアプリでこのモデルを使ったことがありますが、メッセージの作成と返信のためのコントローラを作成するのは本当に苦労しています。簡単な例がありますか?それが良いのであれば、私は新しい質問としてそれを始めることができます。 – Dave

関連する問題