2

Я создаю небольшую социальную сеть в Rails, где люди могут добавлять друг друга как друг. Я создал модель под названием 'user', которая содержит, e-mail, сильный хеш md5 с солью пароля и т. Д.У пользователя много: пользователей, или я должен использовать другой способ для социальной сети друзей?

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

+1

Вы имеете в виду «пользователь, который содержит, e-mail, * хэш * пароля» правильно? –

+0

Да, md5'd и с солью, так что это unpassworddictionaryable = D – 2010-02-15 20:24:47

ответ

2

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

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

+0

Итак, вы на самом деле означаете «добавление модели дружбы, которая имеет user1s_id: integer и user2s_id: integer»? – 2010-02-15 20:31:56

+0

Спасибо, я всегда делал это на PHP, но я задал этот вопрос, чтобы проверить, есть ли еще Railsy путь. Насколько я понимаю, это трудный способ, предложенный @EmFi, но это проще. – 2010-02-15 20:45:20

+0

Что Bigwave описывает не обязательно, что я сказал, было трудным путем. Это решение описывает полиморфные отношения, которые позволяют более подробно. Это не совсем понятно. Но это похоже на описание однонаправленных отношений (т. Е. Как и я могу быть с вами друзьями, но это не значит, что вы со мной друзья). – EmFi

2

По сути, вы хотите создать модель объединения, которая объединяет пользователей. Но для 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, вероятно, не сможет управлять ассоциациями для вас.

+0

О, да, используйте Rails: http://en.wikipedia.org/wiki/Twitter#Technology – 2010-02-15 20:37:35

+0

Похоже, я ошибаюсь в Twitter, используя проблему Rails. Я предположил, что новости об их переключении на Scala означают, что они полностью отказываются от Rails. – EmFi

2

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