3

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

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

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

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

请指教,

谢谢

4

4 回答 4

8

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

但是,在某些情况下它仍然有意义。

  • 当您想允许数据点的可变列表时
  • 您不会根据列表中的值之一查询数据

ActiveRecord 对此有内置支持。您可以存储Hash或存储Array在数据库列中。

  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. 现在,您可以将Hashor保存Array在数据库字段中!

    Exp.new(:skill => ['Cooking', 'Singing', 'Dancing'])
    
于 2013-09-09T04:30:30.443 回答
1

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

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

于 2013-09-09T04:19:10.193 回答
0

Rails 4 和 PostgreSQL 提供hstore了开箱即用的支持,更多信息在这里在 rails 3 你可以使用gem来启用它。

于 2013-09-09T04:01:25.650 回答
0

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

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

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

于 2013-09-09T04:40:23.417 回答