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

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

ただいまの
回答率

90.52%

  • Ruby on Rails

    7246questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 104

krppppp

score 4

目的

途中参加でアプリケーションの作成に携わる事になり、現在題名にもありますようにユーザー間のやりとりを行うLINEに似たMessage機能の設置を任せられました。
途中まで手が入っていてそこからの改良をおこなっております。
下に説明付きでソースコードを乗せますので是非お助けいただけましたらと思います。

最終目的は下の3つの条件
1、相手からのみ送信メッセージがある時
2、自分からのみ送信メッセージがある時
3、互いにメッセージを一回以上送信した時
を一つのインスタンス変数に入れてView(Message#index)のeachで回して出力したい。 です。

ソースコード

Controller

class MessagesController
 def index
   @talk_available_members = Message.find_talk_available_members(current_member.id)
 end
# 相手が一発目のメッセージを自分あてに送っていたとしたらindexに表示されません
end

Model

class Message 
 belongs_to :sender, class_name: "Member"
 belongs_to :receiver, class_name: "Member"


 def self.find_talk_available_members(member_id)
  Message.where(sender_id: member_id).select(:receiver_id).distinct.where.not(receiver_id: member_id) 
 end

 def self.find_talk_messages(sender, receiver)
  Message.where(sender_id: sender, receiver_id: receiver).or(Message.where(sender_id:receiver, receiver_id: sender))
 end

View

index.html.erb


<% @talk_available_members.each do |m|%>
 <%= link_to message_member?path(m.receiver), class:'card' do %>
  <%= image_tag avatar(m.receiver) %>
  <%= m.receiver.name %>
  <%= Message.find_talk_messages(current_member, m.receiver).last.body%>
 <% end %>
<% end %>

解決策(失敗)

 def self.find_talk_available_members(member_id)
  Message.where(sender_id: member_id).select(:receiver_id).distinct.where.not(receiver_id: member_id) 
 end

#このメソッドが相手からのメッセージが無い場合で既に働かないので

 def self.find_talk_available_members2(member_id)
  Message.where(receiver_id: member_id).select(:sender_id).distinct.where.not(sender_id: member_id) 
 end

#逆のメソッドを設けてみたもの、一つのインスタンス変数へ二つの条件を織り込む方法がわからなかった。

2

1で設けたメソッドを別のeach文で回せば出力は出来るが、
互いに一度でもメッセージを送れば出力は勿論2つでてしまう(ダブり)

求めるコード

上にも書きましたが、
下の3つの条件
1、相手からのみ送信メッセージがある時
2、自分からのみ送信メッセージがある時
3、互いにメッセージを一回以上送信した時
を一つのインスタンス変数に入れてView(Message#index)のeachで回して出力したい。 です。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    7246questions

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