2015-09-07 56 views
1

目前有一個圖紙模型,與特定的jsonb屬性:的PostgreSQL 9.4 jsonb我怎麼RO查詢

 create_table "sheets", force: :cascade do |t| 
     t.string "name" 
     t.integer "user_id", default: 0, null: false 
     t.boolean "private", default: true, null: false 
     t.jsonb "t_data",  default: {}, null: false 
     end 

在T_DATA jsonb屬性,我要存儲一個列表(這樣多線),其含量應像這樣:

def sample_3_content 
     { 
     headings: [ 
      "Rendering engine", 
      "Browser", 
      "Platform", 
      "Engine version", 
      "CSS grade" 
     ], 
     rows: { 
       "line_0":{ 
        "Rendering engine":"Trident", 
        "Browser":"Internet Explorer 4.0", 
        "Platform":"Win 95+", 
        "Engine version":"4.0", 
        "CSS grade":"X" 
       },    
       "line_1":{ 
        "Rendering engine":"Trident", 
        "Browser":"Internet Explorer 5.0", 
        "Platform":"Win 95+", 
        "Engine version":"5", 
        "CSS grade":"C" 
       }, 

此查詢

Sheet('rows @> ?', {"CSS grade" => "X" }.to_json) 

是引發錯誤

NoMethodError: undefined method `Sheet' for main:Object 

我不確定這是最好的模式...因爲我想查詢不同標題上的所有行,即「CSS等級」==「X」,「瀏覽器」包含「資源管理器」.. 。

重寫我的架構的任何建議,歡迎...

回答

1

我的建議是不要用"line_0"關鍵,因爲它會在您提供您的JSONB內容列結構過度。使用普通數組爲"rows"鍵可以更靈活。例如DDL樣本數據可能看起來像:

CREATE TABLE sheets (content JSONB); 
INSERT INTO sheets VALUES 
    ('{ 
    "headings": [ 
     "Rendering engine", 
     "Browser", 
     "Platform", 
     "Engine version", 
     "CSS grade" 
    ], 
    "rows": [{ 
        "Rendering engine":"Trident", 
        "Browser":"Internet Explorer 4.0", 
        "Platform":"Win 95+", 
        "Engine version":"4.0", 
        "CSS grade":"X" 
     }, 
     { 
        "Rendering engine":"Trident", 
        "Browser":"Internet Explorer 5.0", 
        "Platform":"Win 95+", 
        "Engine version":"5", 
        "CSS grade":"C" 
     } 
    ] 
    }'::JSONB); 

在這種情況下,你必須查詢數組元素,不是明確地說row->'line_X'->>'jsonAttribute'自由得多。示例查詢可以是以下內容:

SELECT * FROM sheets,jsonb_array_elements(content->'rows') as row 
WHERE row->>'CSS grade' = 'X' 
AND row->>'Platform' = 'Win 95+'; 
+0

謝謝..得到它我更新了我的模式.. – erwin