質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1666閲覧

LINEに似たメッセージのやり取り機能を作りたい

krppppp

総合スコア13

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/04/23 09:20

#目的
途中参加でアプリケーションの作成に携わる事になり、現在題名にもありますようにユーザー間のやりとりを行う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で回して出力したい。 です。

このあと時間でソートして最新のメッセージのやり取り順で降順で出したいのでこう言った考えで行っておりました。
駄文で御座いましたがご協力の程よろしくお願いし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

普通に、
(receiver_id = member_id && sender_id = member_2_id) or (receiver_id = member_2_id && sender_id = member_id)
みたいなことをすればいいんでは。

投稿2018/04/23 09:30

kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問