这个模板系统效率如何?

时间:2015-04-09 12:36:29

标签: ruby-on-rails ruby

Users可以是6种不同类型中的一种' - 每种类型总共有12个模板。

每个模板都有自己的模型,与每个模板的belongs_to模型User模型Userhas_one关系,但我担心它意味着我在user模型上有72个关系

在创建用户时,我将使用case语句根据它们的用户类型创建模板 - 模板编辑器将简单地更新模板当前数据库条目。

值得注意的是,模板在可编辑字段和动态内容方面各不相同,这就是我为每个模板分别设置模型的原因。

关于如何改善这一点的任何建议都很棒,它让我疯狂。

2 个答案:

答案 0 :(得分:0)

您正在编写的任何解决方案" has_one ..."你的model.rb文件中的72次显然是错误的。

基本上我认为你需要添加更多的表/类来处理用户之间的关系,"类型"和模板。这是你的策略。

我会让用户"输入" (我认为"角色"在这里是一个更好的词,也不是一个保留词,意味着你将有更少的问题)到一个班级。我还有一个连接类/表,它将角色链接到多对多关系中的模板。

我会有一个模板类。

我实际上会尝试使用与模板相反的方式:我会尝试尽可能地将它们带回到一个简单的结构中。任何情况下,你正在为一个变化的东西创建一个全新的类,这表明你走错了方向。

相反,看看模板之间的差异,并将这些ASPECTS抽象到自己的类中。因此,如果一个模板有三个部分,它们是一个" foo部分",一个" bar部分"和" baz部分",然后创建一个TemplateSection类,并制作一个" foo"," bar"和" baz"实例/记录。然后有一个连接表以多对多的方式将模板连接到TemplateSections。连接表可以保存特定于"特定方式的部分X在模板Y"中使用的任何数据。

基本上,每当出现变化时,尽可能尝试将变量保持在IN DATA而不是代码中。这将要求您仔细建模您的应用程序,使新的类/表适合。

答案 1 :(得分:0)

我认为有两种可能的方法,具体取决于所需的灵活性。

选项1:通过ActiveRecord关联构建所有内容

创建一个Template模型和72个模型对象,每个模板对应一个。创建一个FieldType模型来表示模板所包含的不同部分,例如" title"或"描述"。然后创建一个Field连接模型,该模型表示模板对字段的实际使用情况:

class Template
  has_many :fields
end

class FieldType
  has_many :fields
end

class Field
  belongs_to :template
  belongs_to :field_type
end

FieldType模型存储了各处相同的字段的所有属性 - 名称,类型(文本,数字等)。 Field模型存储模板之间不同的所有与使用相关的属性。一个例子:

login_page = Template.create name: 'Login page'
dashboard  = Template.create name: 'Dashboard'

title_field = FieldType.create name: 'Title',
                               kind: 'text' # careful with reserved words such as 'type'

login_page.fields.create field_type: title_field, required: true
dashboard.fields.create field_type: title_field, required: false

我们有两个页面使用名为title的相同字段,但在登录页面上该字段是必填字段,而在仪表板上则不是。

这样做的好处在于它在Rails'中发挥得很好。能力;你可以使用ActiveRecords查找器,验证,表单助手,工作。

选项2:代表您的数据无模式

如果您使用Postgres作为数据库,您将获得强大的数据类型,如JSON,JSONB和Hstore,允许您在单个数据库列中存储任意数据:

class CreateTemplates < ActiveRecord::Migration
  def change
    create_table(:templates) do |t|
      t.hstore :template_data
  end
end

Template.create template_data: {
  foo: 'foo',
  bar: 1
  baz: {
   quux: 'kittens'
  }
}

这提供了最大的灵活性。缺点是,在验证,表单处理等方面,您将无法获得Rails的全方位服务体验,并且您将遇到一些障碍,例如布尔变成字符串。