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

时间:2013-09-09 03:51:46

标签: ruby-on-rails ruby database database-design relational-database

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

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

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

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

请指教,

由于

4 个答案:

答案 0 :(得分:8)

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

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

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

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'])
    

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

Rails 4和PostgreSQL提供开箱即用的hstore支持,更多信息here在rails 3中,您可以使用gem启用它。

答案 3 :(得分:0)

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

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

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