2016-10-16 18 views
0

でテーブル属性の値与えられた条件を見つける:RailsのActiveRecordの私は2つのテーブルを持っている2つのテーブル

  1. それぞれ(「recipient_id」に関連したそのID(と二人のユーザIDとの会話のリストが含まれている会話のテーブル
  2. 既存の会話の1つに関連付けられたメッセージを含むメッセージテーブルメッセージのすべてのインスタンスには、会話に未読メッセージがあるかどうかを示すブール属性「読み取り」(デフォルトはfalse)が含まれています。

だから会話has_many:メッセージとメッセージbelongs_to:会話

私の目的は、current_userに未知のメッセージ(既存の会話のいずれか)があるかどうかを確認して一般的な警告を表示することです。 これまでは会話ごとにアラートを表示していましたが、一般的な方法を実装する効率的な方法を見つけるのには苦労しています。

私の独創的なアプローチはしました:現在のユーザーの会話のそれぞれの最後のメッセージを探す

  1. これらの最後のメッセージが現在のユーザーによって送信されたかどうかを評価し、read == falseの場合は評価します。
  2. これらの最後のメッセージのいずれかがこれらの条件を満たす場合にtrueを返します。

これは、次のコードに変換:「私は非常に新しいコーディングだが、いずれかがあるかどうそれはかなり非効率的な方法は、すべてのcurrent_usersの会話をループしたと確認するためのアレイを作成するようだ

@conversations = current_user.conversations 
    @unread = [] 
    if @conversations.exists? 

     @conversations.each do |conversation| 
     if conversation.messages.exists? 
      if conversation.messages.last.user_id != current_user.id && conversation.messages.last.read == false 
      @unread << true 
      end 
     end 
     end 
    end 

    @unread.include?(true) 
end 

それに真の価値があります。

メッセージ自体をループしますが、インスタンスには送信者のuser_idしかありません。そのため、会話モデルとリンクしていないと、メッセージが送信されたかどうかを知る方法がありません。

より適切なアクティブレコードクエリまたはより良いアプローチでこれを達成する効率的な方法をお手伝いしてください。

ところで、私の開発環境でpostgresqlを使用していますが、問題はわかりません。

おかげ

答えて

0

次のようなものでcurrent_userためconversationのIDを取得することができます。

unread_count = Message.where(convsersation_id: conv_ids, read: false).where.not(user_id: current_user.id).count 

conv_ids = current_user.conversations.pluck(:id) 

メッセージは以下のようにあなたに必要な基準を満たすカウント取得するクエリを実行しますunread_count > 0の場合は、アラートを表示することができます

私はすべてのメッセージがread :trueの値を読み込んだと仮定しているので、このクエリは、会話の最後のメッセージがread :false以外の他のメッセージであってもtrueを返します。

PS:質問をテストしていないので、チェックし、必要に応じて調整してください。ここに何か不足している場合は、コメントで質問してください。

+0

ありがとうサザン。それは理にかなっている。私はそれを試してみて、それについて考えてみましょう、私はニュースがすぐにあなたに戻ってください。 – Andrew

関連する問題