0
votes

I have a problem listing one of my models.. I am following the tutorial http://josephndungu.com/tutorials/gmail-like-chat-application-in-ruby-on-rails In this tutorial you make a conversation that has a recipient_id and a sender_id these are both foreign keys to the conversation table. the current_user is set on either recipient or sender when the conversation is made.

-I can only list the current_user.conversations when the current_user is a sender. -When i try with a current_user that is a recipient I get no result.

-Figured out that in my user model I have a has_many conversations with a foreign_key :sender_id. When I change this to recipient_id, then only the current_user that is a recipient can list conversations.

-With this I assume that I need to have two foreign keys referencing the same user? What can I do to get conversations to list for both current_users?

User.rb "model"

has_many :conversations, class_name: "Conversation", :foreign_key => :sender_id

listing conversation for current_user:

<% current_user.conversations.each do |conversation| %>

    <p>hi</p>
    <% end %>

Conversation.rb "model"

class Conversation < ActiveRecord::Base

  belongs_to :sender, :foreign_key => :sender_id, class_name: 'User'
  belongs_to :recipient, :foreign_key => :recipient_id, class_name: 'User'

  has_many :messages, dependent: :destroy

  validates_uniqueness_of :sender_id, :scope => :recipient_id

  scope :involving, -> (user) do
    where("conversations.sender_id =? OR conversations.recipient_id =?",user.id,user.id)
  end

  scope :between, -> (sender_id,recipient_id) do
    where("(conversations.sender_id = ? AND conversations.recipient_id =?) OR (conversations.sender_id = ? AND conversations.recipient_id =?)", sender_id,recipient_id, recipient_id, sender_id)
end

end
1

1 Answers

1
votes

The problem is that in your User.rb model you are saying that The conversations of this user are those whose sender_id is this user. That is the reason why when you use current_user.conversations you only get those records where sender_id is the current user.

I would do the following in your User.rb model:

has_many :conversations_started, class_name: "Conversation", :foreign_key => :sender_id
has_many :conversations_continued, class_name: "Conversation", :foreign_key => :recipient_id

This way you would be able to invoke:

current_user.conversations_started

or

current_user.conversations_continued

However, if you want to be able to list them all, you will need to define an additional method in your User.rb model:

def conversations
  conversations_started + conversations_continued
end

If a user can start a conversation with itself, I would add .uniq at the end of the conversations method