0

どのメッセージが削除されたかどうかに応じて、ユーザーのメッセージスレッドにメッセージを表示する方法を見つけるのに少し苦労しました。削除されたメッセージ "sender_status または recipient_status" は、メッセージの削除時に 0 から 1 に変わります。現在、受信トレイにユーザーのメッセージスレッドのリストを表示するために、次を使用しています。

例えば

current_user = User.find(2)
current_user.message_threads

これにより、送信者または受信者のステータスが 0 のすべての message_threads が取得されます。

class User < ActiveRecord::Base

  has_many :messages
  has_many :message_threads

素晴らしく簡単ですが、今やりたいことは、現在のスレッドから送信者または受信者のステータスが0のメッセージを取得できるようにする方法を設定することです. したがって、次のように入力するとします。

one_thread = current_user.message_threads.first

このスレッドから、必要なメッセージだけを簡単に取得できるようにしたいと考えています。最終的に入力できるように、 message_thread モデルに何かを入れたいと思います:

current_user.message_threads.first.messages

#or

one_thread.messages

必要なメッセージのみをロードし、ステータスが「1」のメッセージのみを無視します。

ユーザー モデル:

class User < ActiveRecord::Base

  has_many :messages
  has_many :message_threads

  def message_threads
    MessageThread.where([ '(sender_id = ? AND sender_status = 0) OR (recipient_id = ? AND recipient_status = 0)', self.id, self.id ])
  end

  def messages
    Message.where([ '(sender_id = ? AND sender_status = 0) OR (recipient_id = ? AND recipient_status = 0)', self.id, self.id ])
  end

MessageThread モデル:

class MessageThread < ActiveRecord::Base

  has_many :messages

メッセージ モデル:

  class Message < ActiveRecord::Base

    acts_as_tree
    has_one :message_thread

結合を試してみましたが、うまくいきませんでした。

def messages
  joins(:messages).merge(  Message.where([ '(parent_id = ? AND sender_status = 0) OR (parent_id = ? AND recipient_status = 0)',self.message_id, self.message_id ]) )
end

助けていただければ幸いです。

敬具

4

1 に答える 1

0

問題はオブジェクトone_threadを返すMessageThreadことだと思います。次に、を呼び出してユーザー ID を取得しようとしていますがself.id、間違ったモデルで呼び出されています。

私はこのコードを試していませんが、うまくいくかもしれません:

class User < ActiveRecord::Base
  def self.threads_in_inbox
    message_threads.where('(sender_id = ? AND sender_status = 0) OR (recipient_id = ? AND recipient_status = 0)', self.id, self.id)
  end
end

class MessageThread < ActiveRecord::Base
  def self.inbox_messages
    messages.where('(sender_id = ? AND sender_status = 0) OR (recipient_id = ? AND recipient_status = 0)', self.user.id, self.user.id)
    # this hits the database 1 extra time however due to self.user.id
    # you could change it to inbox_messages(user_id) and pass in the id manually
  end
end

first_thread = current_user.threads_in_inbox.first
first_thread.inbox_messages

あなたの質問では、レールによって生成された関連付けクエリ (message_threads とメッセージ) をオーバーライドしているようです-意図的かどうかはわかりませんが、上記で変更しました。

また、重複を削除して次のことを実行できると思います。

where('(sender_id = ?) AND (sender_status = 0 OR recipient_status = 0)', self.id)
于 2013-02-12T12:32:16.067 に答える