Users
可以是6种不同类型中的一种' - 每种类型总共有12个模板。
每个模板都有自己的模型,与每个模板的belongs_to
模型User
模型User
有has_one
关系,但我担心它意味着我在user
模型上有72个关系
在创建用户时,我将使用case语句根据它们的用户类型创建模板 - 模板编辑器将简单地更新模板当前数据库条目。
值得注意的是,模板在可编辑字段和动态内容方面各不相同,这就是我为每个模板分别设置模型的原因。
关于如何改善这一点的任何建议都很棒,它让我疯狂。
答案 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的全方位服务体验,并且您将遇到一些障碍,例如布尔变成字符串。