2015-01-23 7 views
10

मैं एक रेल मॉडल है जो प्रकार के "json" एक डेटाबेस स्तंभ है है का उपयोग कैसे करें:ActiveRecord json फ़ील्ड प्रकार

create_table "games", force: true do |t| 
    t.json  "game_board" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

वाह! अब मैं इसका उपयोग कैसे करूं? क्या यह वास्तव में treating the field like a Hash जितना सरल है?

self.game_board[:player1] = 1 
self.game_board[:cards] = cards.to_hash 

मुझे लगता है कि लिखने के लिए थे, तो सब कुछ अपेक्षा के अनुरूप काम करेगा, तो एक ग्राहक से एक भविष्य API कॉल में मैं इस ?:

self.game_board[:player] # And get back the 1 that I put here before 

क्या प्रदर्शन के बारे में रूप में अच्छी तरह कर सकता है? क्या पूरे game_board हर बार डी-सीरियलाइज किया जाएगा, भले ही वह फ़ील्ड कभी नहीं पढ़ा जाए? जब भी मैं "हैश" का हिस्सा बदलता हूं, तो क्या फ़ील्ड फिर से लिखा जाएगा (I डेटाबेस डेटाबेस लिखें)

उत्तर

20

हां, ActiveRecord Postgres 'json-फ़ील्ड का उपयोग अपने मॉडल में हैश के रूप में करने की अनुमति देता है। आप क्षेत्र :game_boardNULL होने की अनुमति

  1. हैश प्रारंभ
    पर शून्य हो सकता है आपके create_table प्रवास में: हालांकि, वहाँ चीजों की एक जोड़ी पर विचार कर रहे हैं। इस प्रकार, पहले उपयोग पर आपके मॉडल-उदाहरण के क्षेत्र :game_boardNULL होंगे और इसे उपयोग करने से पहले आपको हैश को प्रारंभ करना होगा। (नीचे उदाहरण देखें)

  2. JSON में सभी चाबियाँ इस प्रकार तार
    कर रहे हैं, को बचाने (और पुनः लोड) पर अगर तुम से पहले चिह्न या संख्याएं का इस्तेमाल किया है सभी कुंजियों स्ट्रिंग्स में परिवर्तित हो जाएगा। इस प्रकार, अवांछित व्यवहार को रोकने के लिए स्ट्रिंग-चाबियों का उपयोग करने की अनुशंसा की जाती है जब तक कि आपका ओआरएम सभी चाबियों का प्रतीक बनने के लिए कॉन्फ़िगर नहीं किया जाता है।


आपका उदाहरण:

self.game_board   ||= {} 
self.game_board[:player1] = 1 
self.game_board[:cards] = cards.to_hash 

# after reload from database (access via String-key): 
self.game_board['player1'] # And retrieve value 1 (that we put here before) 


@ प्रदर्शन:

  1. हाँ, हर बार ActiveRecord डेटाबेस से किसी प्रविष्टि पढ़ता है और, एक मॉडल-उदाहरण बनाता JSON -फील्ड हेश में अनियमित हो जाते हैं। लेकिन अगर आपको लगता है कि यह आपके एप्लिकेशन पर प्रदर्शन-हिट है, तो आपको या तो टेक्स्ट-फ़ील्ड का उपयोग करना चाहिए और JSON/Hashes को क्रमबद्ध/deserialize करना चाहिए जब आपको आवश्यकता हो या बेहतर हो, ActiveRecord का उपयोग न करें। कक्षाओं के ढेर बनाकर और जादू-विधियों का उपयोग करके, ActiveRecord इतना ऊपरी बनाता है कि आपको JSON के deserialization के बारे में चिंता न करें। सुविधा इसकी लागत है।

  2. हां, हर बार जब आप हैश में कोई मान बदलते हैं, तो (पूरे) JSON-field को नए क्रमबद्ध संस्करण के साथ बदल दिया जाता है और अपडेट किया जाता है। इस पर
    दो टिप्पणियां:

    • भी Postgres ही (ActiveRecord में न केवल) में कुछ JSON-तत्वों पर अद्यतन प्रदर्शन करने की संभावना अब तक लापता है। Compare this Stackoverflow-question
    • सामान्य रूप से, JSON-फ़ील्ड को निश्चित संरचना के साथ या कम से कम, प्रबंधनीय आकारों में उपयोग किया जाना चाहिए और फ़ील्ड-प्रकार को दस्तावेज़-स्टोर नहीं होना चाहिए जैसे कि। MongoDB में।Compare the Postgres documentation
संबंधित मुद्दे