Связь Has_and_belong_to_many с той же моделью

Я пытаюсь реализовать отношение has_and_belong_to_many с той же моделью, но не знаю, как это сделать.

Например, пользователь должен иметь возможность следить за другими пользователями.

Кроме того, у меня есть несколько полей одной и той же модели в этой модели; как бы я дал ему другое имя?


person Gardezi    schedule 14.05.2015    source источник
comment
Какую версию Rails вы используете?   -  person steve klein    schedule 14.05.2015
comment
Возможный дубликат схемы stackoverflow.com/questions/19770888/   -  person steve klein    schedule 14.05.2015
comment
@steveklein рельсы 4.2.0   -  person Gardezi    schedule 14.05.2015


Ответы (1)


Есть два сценария и две разные реализации:


Модель «Друзья».

Допустим, у одного User может быть много :friends, где каждый друг также является объектом модели User. Вы можете сделать это следующим образом:

has_and_belongs_to_many :friends, class_name: 'User'

Это сообщает рельсам, что объект класса User может иметь отношение «многие ко многим» сам с собой как friends. Таким образом, вы можете вызвать что-то вроде этого:

@user_a.friends
#=> [@user_x, @user_y, @user_z]  # Array of User Objects

@user_x.friends
#=> [@user_a, @user_b, @user_c]  # Array of User Objects

Модель «Последователи/Последователи»

Допустим, один User может подписаться на других пользователей, а другие пользователи могут подписаться на него. Вот как вы это реализуете:

has_many   :followers, class_name: 'User', inverse_of: :following
belongs_to :following, class_name: 'User', inverse_of: :followers

Это говорит рельсам, что у каждого пользователя может быть много followers, которые являются массивом других объектов User, и этот пользователь доступен другим как объект в массиве following. Например, если @user2 следует за @user1, это будет выглядеть так:

@user1.followers
#=> [@user2, @user3]

@user2.following
#=> [@user1]
person Sheharyar    schedule 25.05.2015
comment
Я всегда застревал с параметрами inverse_of... можете ли вы пояснить, что он делает? - person Arup Rakshit; 25.05.2015
comment
+1 для более подробной информации. И все же, что там делает технически inverse_of опция? Что-нибудь вроде кеширования...? Получил ответ, это оптимизация. - person Arup Rakshit; 25.05.2015
comment
Почему здесь не нужно упоминать foreign_key? - person Arup Rakshit; 25.05.2015
comment
Несколько способов сделать одно и то же... Нам не нужно указывать это здесь явно, так как мы уже используем inverse_of. Если вместо этого мы используем foreign_key, нам придется заменить following на following_ids. Я думаю, что подход inverse_of выглядит чище. - person Sheharyar; 25.05.2015
comment
Руководство по ассоциациям содержит гораздо больше информации по этому вопросу. - person Sheharyar; 25.05.2015
comment
Я прочитал руководство. Но, похоже, опытные глаза когда-нибудь поймут, что они имели в виду.. Сейчас я далеко от этих глаз.. в любом случае спасибо за ответы... - person Arup Rakshit; 25.05.2015