#目的
途中参加でアプリケーションの作成に携わる事になり、現在題名にもありますようにユーザー間のやりとりを行うLINEに似たMessage機能の設置を任せられました。
途中まで手が入っていてそこからの改良をおこなっております。
下に説明付きでソースコードを乗せますので是非お助けいただけましたらと思います。
最終目的は下の3つの条件
1、相手からのみ送信メッセージがある時
2、自分からのみ送信メッセージがある時
3、互いにメッセージを一回以上送信した時
を一つのインスタンス変数に入れてView(Message#index)のeachで回して出力したい。 です。
#ソースコード
##Controller
rb
1class MessagesController 2 def index 3 @talk_available_members = Message.find_talk_available_members(current_member.id) 4 end 5# 相手が一発目のメッセージを自分あてに送っていたとしたらindexに表示されません 6end 7
##Model
rb
1class Message 2 belongs_to :sender, class_name: "Member" 3 belongs_to :receiver, class_name: "Member" 4 5 6 def self.find_talk_available_members(member_id) 7 Message.where(sender_id: member_id).select(:receiver_id).distinct.where.not(receiver_id: member_id) 8 end 9 10 def self.find_talk_messages(sender, receiver) 11 Message.where(sender_id: sender, receiver_id: receiver).or(Message.where(sender_id:receiver, receiver_id: sender)) 12 end
##View
rb
1index.html.erb 2 3 4<% @talk_available_members.each do |m|%> 5 <%= link_to message_member?path(m.receiver), class:'card' do %> 6 <%= image_tag avatar(m.receiver) %> 7 <%= m.receiver.name %> 8 <%= Message.find_talk_messages(current_member, m.receiver).last.body%> 9 <% end %> 10<% end %>
#解決策(失敗)
##1
rb
1 2 def self.find_talk_available_members(member_id) 3 Message.where(sender_id: member_id).select(:receiver_id).distinct.where.not(receiver_id: member_id) 4 end 5 6#このメソッドが相手からのメッセージが無い場合で既に働かないので 7 8 def self.find_talk_available_members2(member_id) 9 Message.where(receiver_id: member_id).select(:sender_id).distinct.where.not(sender_id: member_id) 10 end 11 12#逆のメソッドを設けてみたもの、一つのインスタンス変数へ二つの条件を織り込む方法がわからなかった。
##2
1で設けたメソッドを別のeach文で回せば出力は出来るが、
互いに一度でもメッセージを送れば出力は勿論2つでてしまう(ダブり)
#求めるコード
上にも書きましたが、
下の3つの条件
1、相手からのみ送信メッセージがある時
2、自分からのみ送信メッセージがある時
3、互いにメッセージを一回以上送信した時
を一つのインスタンス変数に入れてView(Message#index)のeachで回して出力したい。 です。
このあと時間でソートして最新のメッセージのやり取り順で降順で出したいのでこう言った考えで行っておりました。
駄文で御座いましたがご協力の程よろしくお願いし
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。