Предположим, у нас есть сайт с фотографиями. Любой автор может подписаться на получение обновлений от любого другого автора. Очевидно, что если автор A подписан на автора B, это не означает, что B подписан на A. Поэтому мы строим модели
class Author < ActiveRecord::Base
has_many :subscriptions
has_many :subscribed_by_author, :through => :subscriptions, :source => :subscribed_to
end
class Subscription < ActiveRecord::Base
belongs_to :author
belongs_to :subscribed_to, :class_name => "Author", :foreign_key => "subscribed_to"
end
Таким образом, мы можем использовать
- some_author.subscribeed_by_author - список авторов, на которых подписан some_author.
- Для любой подписки мы можем знать оба конца (кто на кого подписан)
Но вопрос в том, как получить список людей, подписанных на какого-либо автора, используя только рельсы (не используя простой SQL), т.е. получить ответ: «Кто подписан на some_author?»
Вопрос: есть ли в Rails возможность заставить отношения работать с обеих сторон, то есть не только писать some_author.subscribed_BY_author
, но и иметь some_author_subscribed_TO_author
? Если есть, то что это?
P.S. Очевидное решение -
- Изменить дизайн базы данных, добавив столбец с именем "direction"
- Создание 2 записей каждый раз при создании подписки
Добавить к автору модель
has_many: subscribed_BY_author,: through =>: подписки,: source =>: subscribed_to,: условий => "direction = 'by'"
has_many: подписано_TO_author,: через =>: подписки,: источник =>: подписано_то,: условия => "direction = 'to'"
Но мне интересно, есть ли решение без изменения дизайна базы данных.