2015-04-16 5 views
1

У меня есть приложение Rails, в котором пользователь может подписаться на аддоны, список динамический и содержит в настоящее время около 10 аддонов.Дизайн модели для аддонов в приложении

В списке указано, что включено/выключено.

Каждый аддон имеет довольно уникальный набор свойств.


Мое текущее решение является то, что приложение имеет 2 модели «родитель» и одну новую модель для каждого аддона:

class AddonPrototype 
    has_many :addons 
end 

class Addon 
    belongs_to :addon_prototype 
    belongs_to :user 
end 

class AddonAlpha 
    belongs_to :addon 
end 

class AddonBeta 
    belongs_to :addon 
end 

etc.. 
  1. Модель AddonPrototype имеет один экземпляр каждого аддона, с имя по умолчанию - единственное свойство.

  2. Модель Addon со свойствами enabled, custom_name. Когда пользователь посещает страницу с помощью аддонов, выполняется проверка, чтобы проверить, имеет ли пользователь экземпляр Addon для каждого существующего AddonPrototype, или же создать его «на лету».

  3. Для каждого аддона существует уникальная модель (например, AddonAlpha, AddonBeta и т. Д.), С набором свойств apt для каждого конкретного аддона.

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

+0

Что такое 'AddonPrototype',' AddonAlpha' и 'AddonBeta'? – fivedigit

+0

'AddonPrototype' является дедушкой, каноническим идентификатором каждого уникального аддона, там будет около десяти экземпляров. 'AddonAlpha' является внуком одного из экземпляров« AddonPrototype »и содержит все настройки для определенного пользователя. – Numbers

ответ

1

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

В настоящее время наименования моделей, похоже, немного вводят в заблуждение. AddonPrototype является фактическим аддоном, тогда как модель Addon представляет собой действие пользователя, установившего аддон.

Вот структура я пошел бы для:

# app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :installations 
    has_many :addons, through: :installations 
end 

# app/models/addon.rb 
class Addon < ActiveRecord::Base 
    has_many :installations 
    has_many :users, through: :installations 
end 

# app/models/installation.rb 
class Installation < ActiveRecord::Base 
    belongs_to :addon 
    belongs_to :user 
end 

AddonPrototype был переименован в Addon, а старая Addon модель была переименована в Installation (Subscription или что-то, так бы также хорошее название).

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

+0

Большое спасибо, это отлично. – Numbers

+0

Где было бы лучшее место для хранения данных, уникальных для каждой установки, если каждый аддон имеет другой набор свойств (допустим, для AddonA требуется связанный с ним внешний API-интерфейс, а для AddonB просто нужен адрес электронной почты)? – keshavdv