У пользователя много: пользователей, или я должен использовать другой способ для социальной сети на основе друзей?

Я создаю небольшую социальную сеть в Rails, где люди могут добавлять друг друга в друзья. Я создал модель под названием 'user', который содержит электронную почту, сильный хэш md5 с солью пароля и т. д.

Как мне создать что-то вроде опции добавить другого пользователя в друзья? Возможно ли иметь что-то вроде has_many_and_belongs_to :user в пользовательской модели? Таким образом, пользователь имеет много пользователей и принадлежит многим пользователям. Или я должен использовать другой способ, например, добавить модель дружбы, которая имеет user1s_id:integer а также user2s_id:integer?

3 ответа

Решение

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

Таким образом, вы начинаете с таблицы отношений "один пользователь к другому пользователю" (минимально всего два идентификатора), а затем в будущем вы можете добавить таблицу отношений "один пользователь в группу" (разумеется, когда вы создали группы!)

По сути, вы хотите модель соединения, которая объединяет пользователей с пользователями. Но вам придется использовать более описательные термины для Rails.

Twitter не использует Rails, но вот как их пользовательские ассоциации могут работать в Rails, используя терминологию Twitter. Примечание: Twitter не требует двунаправленного следования (то есть, если пользователь следует за другим, это не означает, что второй пользователь следует за первым)

class User < ActiveRecord::Base
  has_many :followings
  has_many :followers, :through => :followings, :class_name => "User"
  has_many :followees, :through => :followings, :class_name => "User"
end


class Following < ActiveRecord::Base 
# fields: follower_id followee_id (person being followed)
  belongs_to :follower, :class_name => "User"
  belongs_to :followee, :class_name => "User"
end

Принудительная двунаправленная дружба (как, например, Facebook заставляет меня не дружить с вами, если вы не дружите со мной), потребует немного больше работы. Вам нужно будет либо управлять ответными записями с помощью обратных вызовов, либо использовать собственный искатель SQL. Использование специального поиска SQL означает, что ActiveRecord, вероятно, не сможет управлять ассоциациями для вас.

Я бы посоветовал использовать модель дружбы, потому что в db-формате вам понадобится таблица соединения в любом случае, но ее явное указание позволит вам хранить больше деталей об отношениях (например, "друг" или "семья", дата добавлена, ...)

Другие вопросы по тегам