Ruby on Rails:在单个数据库单元中保存多个值

如何在Ruby on Rails应用程序中的单个单元格记录中保存多个值?

如果我有一个名为Exp的表,其名称为: EducationExperienceSkill ,如果我希望用户在一行中存储多个值,例如:教育机构或技能,那么最佳做法是什么?

我想让用户使用多个文本字段,但应该进入相同的单元格记录。

例如,如果用户具有多种技能,那么这些技能应该在一个单元格中? 这会是最好的还是会更好,如果我创建一个新技能表?

请指教,

谢谢

我不建议在同一个数据库列中存储多个值。 这会使查询变得非常困难。 例如,如果您想查找具有特定技能集的所有用户,则查询在可读性和性能方面都会笨拙。

但是,仍然存在某些有意义的情况。

  • 当您想要允许变量数据点列表时
  • 您不会根据列表中的某个值查询数据

ActiveRecord内置了对此的支持。 您可以将HashArray存储在数据库列中。

  1. 只需将列标记为Text

     rails g model Exp experience:text education:text skill:text 
  2. 接下来,序列化Model代码中的列

     class Exp < ActiveRecord::Base serialize :experience, :education, :skill # other model code end 
  3. 现在,您可以在数据库字段中保存HashArray

     Exp.new(:skill => ['Cooking', 'Singing', 'Dancing']) 

您可以使用单个列中的序列化列表(以逗号分隔)来执行此操作,但这是一个非常糟糕的主意,请阅读这些答案以获得推理:

  • 将分隔列表存储在数据库列中真的那么糟糕吗?
  • 如何将列表存储在数据库表的列中

我建议更改您的架构,以便在用户和技能之间建立一对多的关系。

Rails 4和PostgreSQL hstore即用hstore支持,更多信息在rails 3中你可以使用gem来启用它。

这取决于您想要的function类型。 如果要将Exp模型属性与表单绑定(对于新操作和更新操作)并对它们进行一些validation,最好将它保存在单独的表中。 另一方面,如果这些只是属性,您只需要在数据库中将它们保存在一个列中。 有一种方法可以保存序列化对象,如数据库列中的数组和哈希值。 根据需要将它们设为数组/哈希并保存为这样。

http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize

序列化属性,在从表中拉出时自动反序列化,并在保存时自动序列化。