Приложение Rails 3, «следуя» за различными типами моделей - PullRequest
2 голосов
/ 29 марта 2011

Я строю рельсы 3 App.Я постараюсь описать это приложение в меру своих возможностей и кратко, насколько это возможно.

Два основных типа моделей в этом приложении:

  • Пользователи
  • Предприятия

Тогда есть две другие модели:

  • Категории
  • Подкатегории (вложенные в Категории)

Как они работают вместе: предприятия могут иметь (или принадлежать, скорее) столько категорий, сколько им нравится (и любые связанные с ними подкатегории).

Пользователь может выбирать категории для «подписки», т.е.они выбирают категории, которые они хотят показать в своем фиде, и любые компании, принадлежащие этим категориям, будут отображаться в фиде (то же самое с подкатегориями)

Важно отметить, что категории и подкатегории будутдиктуется только администраторами, пользователи / компании не могут добавлять / уничтожать категории, только следовать за существующими

Мой план того, как реализовать это, заключался в создании модели «следующего» сh следующие атрибуты

  • user_id
  • followable_id
  • followable_type

, из которых будет два "followable_types": пользователь ибизнес.Как вы можете видеть, это не совсем полиморфная модель.

Методы, с которыми я сталкиваюсь.Например, как мне создать список всех предприятий, которые принадлежат категориям, за которыми следует пользователь?Это потребовало бы некоторых хитрых запросов и большого количества взлома.Это заставляет меня поверить, что я подхожу к проблеме с неправильной точки зрения.

Может ли кто-нибудь направить меня в правильном направлении?Может быть, моя архитектура нуждается в некоторой работе.Или подскажите, как мне писать свои методы.

Спасибо !!

1 Ответ

3 голосов
/ 29 марта 2011

Учитывая запросы, которые вы будете регулярно выполнять, я бы, вероятно, покончил с полиморфизмом в этом случае и сделал бы что-то вроде:

class Customer < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

class Business < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

class Categories < ActiveRecord::Base
  has_and_belongs_to_many :customers
  has_and_belongs_to_many :businesses
end

Тогда код для выполнения предложенного вами запроса довольно прост:

Business.joins(:categories).where('categories.id IN (?)', a_user.categories.map(&:id))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...