Rails система личных сообщений - PullRequest
1 голос
/ 24 февраля 2011

Привет, я пытаюсь внедрить систему сообщений, которая используется в социальных сетях.Проблема, с которой я сталкиваюсь, связана, во-первых, со структурой базы данных и, во-вторых, с тем, как реализовать ее в рельсах.
Моя первая идея - я использую 3 таблицы:

messages: id | subject | text | made_at
receivers: id | message_id | read: boolean
создатели: id | message_id | read: boolean

Теперь мне интересно, как реализовать следующие функции:
1.) пользователь можетудали его сообщение.но так как оба хотят прочитать сообщение, как сделать так, чтобы сообщение было удалено только тогда, когда его удалили оба пользователя.
2.) как мне реализовать ответ?или на самом деле, как мне найти соответствующего создателя?
3). как узнать, прочитал ли получатель почту?

другая идея заключается в следующем: creator_messages: id | creator_id | receive_id | subject | text | read | creation_at receive_messages: то же самое, что и creator_messages

это различает пользователей, поэтому они могут удалять свои сообщения индивидуально.но как мне узнать, было ли письмо прочитано или нет?

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

Я думал, что это будет работать так:

model User
  :has_many :send_messages, :class_name=>"messages", :foreign_key=>"creator_id"
  :has_many :received_messages, :class_name=>"messages", :foreign_key=>"receiver_id"
end

model Messages
  belongs_to :user
end

но так или иначе я не заставил это работать.думаю, я упускаю что-то простое здесь.

Надеюсь, кто-то может мне помочь =) спасибо большое

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

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

Я бы создал только модель сообщений, в которой были бы дополнительные поля - receive_read - receive_deleted - sender_deleted

Теперь вы можете добавить хуки к модели, например"after_save", "after_create" здесь вы можете проверить, было ли только что параметру receive_read было присвоено значение true, например, с помощью receive_read_changed?Метод, если это правда, вы можете уведомить отправителя или сделать что-то еще с ним.С помощью этой ловушки after_save вы также можете проверить, что если для sender_deleted установлено значение true, а для receive_deleted уже установлено значение true, вы удаляете все сообщение.

Если у вас несколько получателей, я бы создал модель соединения для получателей ииметь sender_deleted и sender_id в модели сообщения.В модели соединения я бы добавил столбцы receive_id, прочитал и удалил.Теперь я использовал бы метод before_save для сообщений и моделей соединения, чтобы проверить, нужно ли удалить сообщение или нужно ли уведомить отправителя о прочитанном сообщении.

0 голосов
/ 24 февраля 2011

Решение может быть таким:

1) Я бы также создал удаленный (_at) флаг в таблице получателей, если вы действительно хотите жестко удалить сообщения из базы данных, если все получателиудалив его, вы можете установить cronjob или что-то в этом роде.

2) иметь модель creator_id вместо таблицы создателей, я имею в виду, как несколько человек могут создавать одно и то же сообщение?

3)Я не совсем понимаю это, я полагаю, вы устанавливаете флаг «чтение» в таблице получателей на «true», когда этот пользователь открывает сообщение, после этого вы можете сделать область действия в модели пользователей, например, «область действия: чтение»., где (: read, true) ", а также непрочитанный объем.

Надеюсь, это то, что вы имеете в виду.

...