在Ruby中使用嵌套哈希创建关系表

时间:2014-01-17 22:28:59

标签: ruby hash sequel

我正在尝试使用基于嵌套哈希的Ruby Sequel创建表。

有几十个哈希包含数十个数组和哈希数组,但是假设我有以下嵌套哈希值;

{name:'Bob', age: 40, hobbies: [{title: 'breakdancing', skill: 10}, {title: 'yodeling', skill: 7}], favorite_foods: ["Broccoli", "Sardines"]}

以编程方式创建关系表的最简洁方法是什么?让我们说'用户','爱好'和'食物'使用哈希?那么我是否必须进入并设置字段类型?

我只是在学习Ruby,但是手动创建字段然后手动映射并从完美的哈希值中分配值似乎适得其反。

2 个答案:

答案 0 :(得分:0)

根据Sequel documentation,您可以使用“create_table ...将新表添加到数据库”。

create_table(:artists) do
  primary_key :id
  String :name
end

所以,是的 - 你需要为每个嵌套数组或哈希做一次,你想要成为单独的表。您可能希望首先完成将这些哈希变为PORO(Plain Old Ruby Objects)的练习,然后您可以利用这些类来创建表。

答案 1 :(得分:0)

答案在于嵌套属性插件。更多信息可以在下面获得。是的,这并不会神奇地创建表格,但会允许一举写作。

http://www.nerdgem.com/tutorials/3-adding-nested-attributes-to-models

require 'sequel'

DB = Sequel.sqlite('user_test.db')

#DB.create_table(:users) do
#  primary_key :user_id
#  String :name
#end
#
#DB.create_table(:skills) do
#  primary_key :skill_id
#  Integer :user_id
#  String :desc
#  Integer :level
#end

#Models;
class User < Sequel::Model
  one_to_many :skills

  self.plugin :instance_hooks
  self.plugin :nested_attributes
end

class Skill < Sequel::Model
  many_to_one :user
end


User.nested_attributes :skills

#Ruby Hash;
user_info = {:name => "Mike", :skills_attributes => [{:desc => "Curling", :level => 3}, {:desc => "Sorcery", :level => 4}]}

p record = User.create(user_info)