2014-01-18 48 views
1

我正在接收來自GET api調用的響應,該響應在我的數據庫中映射爲1:1。響應看起來像這樣:Rails - 我應該使用哪種數據類型來將數組存儲在數據庫中

response =  { 
     "status": "live", 
     "templates": {}, 
     "responses": 0, 
     "creator": "Marketing", 
     "publish_url": "https://fluidsurveys.com/account/surveys/403975/publish/", 
     "quota_start_date": null, 
     "updated_at": "2014-01-18T16:05:20", 
     "online_url": "http://fluidsurveys.com/surveys/marketing/tampa-bob-gilbertson-3084-nme-survey-emai/", 
     "deploy_uri": "http://fluidsurveys.com/surveys/marketing/tampa-bob-gilbertson-3084-nme-survey-emai/", 
     "settings_url": "https://fluidsurveys.com/account/surveys/403975/settings/", 
     "groups": [], 
     "quota_end_date": null, 
     "offline_url": "http://fluidsurveys.com/surveys/marketing/tampa-bob-gilbertson-3084-nme-survey-emai/offline/", 
     "responses_url": "https://fluidsurveys.com/account/surveys/403975/responses/", 
     "style_url": "https://fluidsurveys.com/account/surveys/403975/theme/", 
     "id": 403975, 
     "upgrade_url": "https://fluidsurveys.com/account/surveys/403975/upgrade-version/", 
     "name": "Bob Gilbertson 3084453 NME Survey Emai", 
     "uri": "https://fluidsurveys.com/api/v2/surveys/403975/", 
     "invites_url": "https://fluidsurveys.com/account/surveys/403975/publish/invites/", 
     "created_at": "2014-01-17T21:47:52", 
     "tags": [ 
     "austin", 
     "nme" 
     ], 
     "preview_url": "http://fluidsurveys.com/surveys/marketing/tampa-bob-gilbertson-3084-nme-survey-emai/?TEST_DATA=", 
     "report_url": "https://fluidsurveys.com/account/surveys/403975/reports/", 
     "version": 4.0, 
     "updated_at_text": "10:05 am", 
     "edit_url": "https://fluidsurveys.com/account/surveys/403975/edit/" 
    } 

正如你所看到的,有我得到回來了,這響應了幾個陣列。例如,我想在我的Survey型號的數據庫中存儲response["tags"]

然而,當我嘗試,我得到一個錯誤:

TypeError (can't cast Array to string):

我怎樣才能解決這個問題呢?我是否應該將string的數據類型更改爲其他內容,或者還有其他需要做的事情來允許將數組存儲在數據庫中?另外,作爲一個獎勵,將數組存儲在數據庫不良實踐中?

回答

1

這裏有幾個選項:

  1. 因爲這是我們處理的標籤,你可以將它們保存爲逗號分隔值,同時還具有字符串基於列:

    person.tags = response['tags'].join(',') # Stores "austin,nme" 
    
  2. 如果您希望能夠查詢單個標籤(並將它們編入索引),那麼單獨存儲標籤可能是一個不錯的選擇。爲此,您需要創建一個模型標記其中多對多關係到您的人類類。

  3. 最後,您可以序列化您的數組YAML並將其存儲在數據庫中的字符串:

    # When storing 
    person.tags = YAML::dump(response['tags']) 
    
    # When fetching from the database 
    tags = YAML::load(person.tags) 
    

    您可以通過這種邏輯移動到型號緩解你的工作訪問器。比方說,你把你的標籤下型號:

    class Person 
        def tags=(value) 
        self.tags = YAML::dump(value) 
        end 
    
        def tags 
        YAML::load(super) 
        end 
    end 
    

編輯:我最喜歡的做法是第二個,這主要是因爲我喜歡讓我的數據庫清潔和結構。將文檔(數組,數據庫,數據庫等)存儲在數據庫中是不錯的做法,只要您知道自己在做什麼以及爲什麼要這樣做。看到整個NoSQL vs 結構化數據庫辯論。我建議的第一個選項可能會滿足您的需求,而不會增加複雜性。

+0

我在最後添加了一個簡短的解釋。 – lipanski

1

默認情況下,Rails不允許將數組存儲在數據庫中。你必須使用序列化函數才能做到這一點。我從來沒有親自做過,因爲我還沒有過,但你可以在這裏找到更多關於它的信息:Storing arrays in database using ActiveRecord

1

Also, as a bonus, is storing arrays in a DB bad practice?

在一個數據庫中存儲陣列的規格化,這是實踐中普遍較差,因爲它阻止訪問它以關係,聲明的方式與SQL。最佳做法是將數組的元素存儲在關聯的表中,併爲其編寫活動記錄關係,如has_manybelongs_to

+0

這比我想要做的更有意義。謝謝你的提示。 – Luigi

相關問題