2014-01-17 36 views
1

我正嘗試使用基於嵌套哈希的Ruby Sequel創建表。從Ruby中的嵌套哈希創建關係表

有幾十個包含數十個哈希數組和數組的哈希,但我們假設我有以下嵌套哈希;

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

以編程方式創建關係表的最簡潔的方法是什麼?讓我們說'用戶','愛好'和'食物'使用散列?那麼我會不得不進入並設置字段類型?

我剛剛學習Ruby,但它似乎適得其反,手動創建字段,然後手動映射和分配一個完美的散列值。

+0

這個問題是標籤的Ruby-on-軌道,所以我必須假設你使用Rails。如果你是Ruby和Rails的新手,我會建議在Rails中使用默認的ORM Active Record。 ActiveRecord使用「遷移」來管理關係數據庫模式。請參閱[Active Record Migrations Rails指南](http://guides.rubyonrails.org/migrations.html)。 – sampierson

+0

這不是Ruby on Rails,但我會弄清楚如何解決這個問題。我實際上只是使用一個紅寶石提示與一個單一的.rb文件。我知道遷移,並手動添加字段。我只想做一些像設置數據庫到哈希。有沒有一個params:這樣做的功能? – Hamptonite

回答

0

根據Sequel documentation,可以使用「create_table ...」將新表添加到數據庫中。

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

所以,是的 - 你需要爲每個嵌套數組或哈希表做一次單獨的表。您可能首先需要完成將這些散列轉換爲PORO(普通老式Ruby對象)的練習,然後您可以利用這些類創建表。

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)