2015-04-16 54 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。当用户使用插件访问页面时,会进行检查以查看用户是否每个现有的AddonPrototype都有一个Addon实例,或者在运行中创建一个实例。

  3. 对于每个插件,都有一个独特的模型(例如AddonAlphaAddonBeta等),其中每个插件都有一组属性。

这样的设计感觉很麻烦,这可能是一个更精简的设置?

+0

“AddonPrototype”,“AddonAlpha”和“AddonBeta”究竟是什么? – fivedigit

+0

'AddonPrototype'是祖父母,每个唯一插件的标准标识符,大约有10个实例。 '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模式已更名为InstallationSubscription或东西一样也将是一个好名字)。

我建议不要在用户访问插件页面时为每个插件创建Installation记录。只需在用户实际安装插件时创建这些记录。这使您的代码更简单,数据库更小。

+0

非常感谢,这非常好。 – Numbers

+0

如果每个Addon具有不同的属性集合(假设AddonA需要与其关联的外部API密钥,并且AddonB只需要一个电子邮件地址),那么存储每个安装所独有的数据的最佳位置是? – keshavdv

相关问题