2016-08-17 49 views
0

我知道在serialize中搜索不好,但是我遇到了這個問題。在rails中搜索序列化列

我得到了一個叫做問題模型,幷包含一個序列化列assignments

id question_set_id assignments 
1 1    {"12982": true, "12332": true} 
2 2    {"12222": true, "12332": true} 
3 3    {'11111': true} 

而且我得到了一個陣列稱爲group_ids

group_ids = ["12982","12332"] 

我需要找到誰包含至少一個group_id記錄assignments

所以,這個例子的結果應該是像

[ 
    { 
        :id => 1, 
     :question_set_id => 1, 
      :assignments => {"12982": true, "12332": true} 
    }, 
    { 
        :id => 2, 
     :question_set_id => 2, 
      :assignments => {"12222": true, "12332": true} 
    } 
] 

我已經試過

Question.where("assignments IS NOT NULL").where("assignments LIKE '%?%'", 12982) 

這似乎工作,但如何應用一個數組?

而且根據這個answer,我試過

Question.where("assignments IS NOT NULL").where("assignments= ?", groups_ids.to_yaml) 

但是,它返回一個空數組。

+0

你使用哪個數據庫(postrgesql/mysql)?你使用哪個序列化器(JSON,Hash,Custom)?哪種類型是您的序列化列(文本,JSON,hstore)? – slowjack2k

+0

mysql,JSON和文本 –

回答

0

用mysql 5.7。?你可以直接查詢JSON數據。我沒有嘗試,但遵照docs像

Question.where("JSON_CONTAINS_PATH(assignments , 'one', '$[*].assignments.12982', '$[*].assignments.12332') == 1") 

應該工作。您可以繼續將文本轉換爲JSON數據類型的列,並獲取JSON文檔和優化存儲的驗證。

+0

我正在使用mysql 5.6,它看起來很難使用。我想我應該修改我的序列化列到許多屬性。 –

+0

如果您必須通過SQL查詢json數據,並且您的數據庫不支持JSON查詢,那麼重構您的數據模型是一個不錯的選擇。 – slowjack2k