Ruby on Rails:在单个数据库单元中保存多个值
如何在Ruby on Rails应用程序中的单个单元格记录中保存多个值?
如果我有一个名为Exp
的表,其名称为: Education
, Experience
和Skill
,如果我希望用户在一行中存储多个值,例如:教育机构或技能,那么最佳做法是什么?
我想让用户使用多个文本字段,但应该进入相同的单元格记录。
例如,如果用户具有多种技能,那么这些技能应该在一个单元格中? 这会是最好的还是会更好,如果我创建一个新技能表?
请指教,
谢谢
我不建议在同一个数据库列中存储多个值。 这会使查询变得非常困难。 例如,如果您想查找具有特定技能集的所有用户,则查询在可读性和性能方面都会笨拙。
但是,仍然存在某些有意义的情况。
- 当您想要允许变量数据点列表时
- 您不会根据列表中的某个值查询数据
ActiveRecord内置了对此的支持。 您可以将Hash
或Array
存储在数据库列中。
-
只需将列标记为
Text
rails g model Exp experience:text education:text skill:text
-
接下来,序列化
Model
代码中的列class Exp < ActiveRecord::Base serialize :experience, :education, :skill # other model code end
-
现在,您可以在数据库字段中保存
Hash
或Array
!Exp.new(:skill => ['Cooking', 'Singing', 'Dancing'])
您可以使用单个列中的序列化列表(以逗号分隔)来执行此操作,但这是一个非常糟糕的主意,请阅读这些答案以获得推理:
- 将分隔列表存储在数据库列中真的那么糟糕吗?
- 如何将列表存储在数据库表的列中
我建议更改您的架构,以便在用户和技能之间建立一对多的关系。
Rails 4和PostgreSQL hstore
即用hstore
支持,更多信息在rails 3中你可以使用gem来启用它。
这取决于您想要的function类型。 如果要将Exp模型属性与表单绑定(对于新操作和更新操作)并对它们进行一些validation,最好将它保存在单独的表中。 另一方面,如果这些只是属性,您只需要在数据库中将它们保存在一个列中。 有一种方法可以保存序列化对象,如数据库列中的数组和哈希值。 根据需要将它们设为数组/哈希并保存为这样。
序列化属性,在从表中拉出时自动反序列化,并在保存时自动序列化。