Rails нарезал личные сообщения - PullRequest
5 голосов
/ 06 декабря 2011

У меня есть две следующие модели:

class Message < ActiveRecord::Base
  belongs_to :to_user, :class_name => 'User'
  belongs_to :from_user, :class_name => 'User'

  has_ancestry #Using the 'ancestry' gem
end

class User < ActiveRecord::Base
  has_many :messages_received, :class_name => 'Message', :foreign_key => 'to_user_id'
  has_many :messages_sent, :class_name => 'Message', :foreign_key => 'from_user_id'
end

Каждому пользователю разрешено вести один разговор с другим пользователем, и все ответы должны быть связаны с исходным сообщением.

В моем действии контроллера 'index' как я могу запрашивать как отправленные, так и полученные сообщения? Например, если пользователь1 нажимает «/ users / 2 / messages /», он должен видеть весь диалог между user1 и user2 (независимо от того, кто отправил первое сообщение). Нужно ли добавлять модель «Поток» или есть способ сделать это с моей текущей структурой?

Спасибо.

1 Ответ

16 голосов
/ 06 декабря 2011

Возможно, вам лучше реструктурировать это как беседу, к которой вы можете присоединиться к людям, чем серию взаимосвязанных сообщений в цепочке.Например:

class Conversation < ActiveRecord::Base
  has_many :messages
  has_many :participants
  has_many :users, :through => :participants
end

class Message < ActiveRecord::Base
  belongs_to :conversation
end

class Participant < ActiveRecord::Base
  belongs_to :conversation
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :conversations
  has_many :participants
end

Когда кому-то отправляется сообщение, создайте для него беседу и пригласите соответствующих сторон, добавив их в список users.

Потоковый обмен сообщениями может бытьдобавлено здесь путем встраивания родительских отношений в само Сообщение или использования предков, хотя на практике это имеет тенденцию быть чрезмерным, поскольку для большинства людей обычно достаточно простого хронологического упорядочения ответов.

Для отслеживания статуса чтения / непрочитанноговам понадобится таблица связи между пользователем и сообщениями напрямую, и это может быть сложно, поэтому избегайте ее, если она вам не нужна.

Имейте в виду, что некоторые имена зарезервированы либо Ruby, либо Rails, и Threadявляется одним из них, поэтому вы не можете иметь модель с таким именем.

...