でテーブル属性の値与えられた条件を見つける:RailsのActiveRecordの私は2つのテーブルを持っている2つのテーブル
- それぞれ(「recipient_id」に関連したそのID(と二人のユーザIDとの会話のリストが含まれている会話のテーブル
- 既存の会話の1つに関連付けられたメッセージを含むメッセージテーブルメッセージのすべてのインスタンスには、会話に未読メッセージがあるかどうかを示すブール属性「読み取り」(デフォルトはfalse)が含まれています。
だから会話has_many:メッセージとメッセージbelongs_to:会話
私の目的は、current_userに未知のメッセージ(既存の会話のいずれか)があるかどうかを確認して一般的な警告を表示することです。 これまでは会話ごとにアラートを表示していましたが、一般的な方法を実装する効率的な方法を見つけるのには苦労しています。
私の独創的なアプローチはしました:現在のユーザーの会話のそれぞれの最後のメッセージを探す
- 。
- これらの最後のメッセージが現在のユーザーによって送信されたかどうかを評価し、read == falseの場合は評価します。
- これらの最後のメッセージのいずれかがこれらの条件を満たす場合に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を使用していますが、問題はわかりません。
おかげ
ありがとうサザン。それは理にかなっている。私はそれを試してみて、それについて考えてみましょう、私はニュースがすぐにあなたに戻ってください。 – Andrew