Самосоединение HABTM или HM/HMT в Rails

У меня есть модель Users, и я хочу, чтобы пользователи могли Subscribe на другой User получать уведомления, когда они что-то публикуют.

Это своего рода самосоединение has_many и самосоединение many_to_many.

Мне нужно иметь возможность набирать @user.subscribers и @user.subscriptions.

Таким образом, отношения в каком-то смысле являются двусторонними по умолчанию. Однако, если @user1 subscribes до @user2, это не означает, что @user2 есть subscribed до @user1, однако @user2 может найти @user1 через @user.subscribers.

Я видел Райана Бейтса Railscast о самореферентных ассоциациях. Однако это создает 1 способ самосоединения. Но я думаю, что это не исключает того факта, что между сторонами может быть два отношения.

Однако я также видел Руководство Rails по связям внешних ключей.

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


person dewyze    schedule 09.04.2013    source источник


Ответы (1)


Не усложняйте вещи

class Subs < ActiveRecord::Base

    belongs_to :subscriber, :class_name => 'User'
    belongs_to :user

end

class User < ActiveRecord::Base

    has_many :subs
    has_many :subscribers, :through => :subs, :source => :subscriber
    has_many :subscriptions, :through => :subs, :source => :user
end

Очевидно, вы должны настроить модель соединения в своей базе данных. И это должно сделать это.

person OneChillDude    schedule 10.04.2013
comment
Я думаю, что это правильно с перевернутыми именами. Я думаю, что пользователь является подписчиком, а результат — подпиской, но это работает. Спасибо! - person dewyze; 12.04.2013