2017-10-13 18 views
5

मैं एक अजीब समस्या में भाग गया जो सबसे अच्छा समाधान ढूंढ रहा है जिसे मैं यहां प्राप्त कर सकता हूं। मैं एक रेल अनुप्रयोग विकसित कर रहा हूं जो एक सामान्य डेटाबेस से डेटा प्रदर्शित करता है जिसका उपयोग किसी अन्य एप्लिकेशन (नोडजेज़) द्वारा किया जा रहा है। सभी सीआरयूडी संचालन दूसरे प्लेटफ़ॉर्म पर होते हैं। रेल ऐप में, हम सिर्फ डेटा पूछते हैं और प्रदर्शित करते हैं।कोई प्रश्न पूछने के बिना डेटाबेस अपडेट के बारे में जानने का कोई तरीका है?

रेल ऐप में, मुझे ताज़ा किए बिना दृश्यों को स्वतः अपडेट करने की आवश्यकता है। उदाहरण

def index 
    @states = State.page(params[:state_page]) 
    @level_one_companies = Company.includes(:state) 
            .where(level: 1) 
            .order('created_at DESC').limit(20) 

    @level_two_companies = Company.includes(:state) 
            .where(level: 2) 
            .order('created_at DESC').limit(20) 
end 

सूचकांक पृष्ठ पर के लिए मैं इन में से प्रत्येक के लिए टेबल होगा और जब नए डेटा राज्य, (या) स्तर 1 (या) स्तर 2 कंपनियों में जोड़ा जाता है मैं टेबल ताज़ा करने के लिए की जरूरत है।

मैं जानता हूँ कि मैं यानी

  1. कार्रवाई केबल ऑटो अपडेट विचारों के दो तरीके के साथ जा सकते हैं।
  2. Jquery का उपयोग करते समय एक समय अंतराल पर डेटा पूलिंग।

आमतौर पर एक्शन केबल का उपयोग करते समय हम डीबी में रिकॉर्ड के बाद सर्वर से डेटा प्रसारित करेंगे (बाद में कार्रवाई में सहेजने के बाद (या) मॉडल से कॉलबैक के बाद)। हालांकि, मैं रेल ऐप के माध्यम से कोई रिकॉर्ड नहीं बना रहा हूं।

मेरा पहला सवाल यह है कि क्या इस मामले में एक्शन केबल का कोई तरीका है?

तो मैं दूसरे विकल्प के साथ गया और यह ठीक काम कर रहा है। लेकिन यह हर एक्स सेकंड के बाद बहुत अधिक डीबी कॉल करता है। क्या विचारों को अद्यतन करने के लिए प्रश्नों को कम करने का कोई तरीका है? मैं यहां के साथ सबसे अच्छा तरीका क्या कर सकता हूं? किसी भी मदद की अत्यधिक सराहना की। धन्यवाद।

उत्तर

3

यदि आपके टैग सही तरीके से सेट हैं, तो आप डेटाबेस के रूप में पोस्टग्रेज़ का उपयोग कर रहे हैं।

पोस्टग्रेर्स एक प्रकाशन-सबस्क्राइब machanism प्रदान करता है जिसे आप अपने डेटाबेस में परिवर्तन सुनने के लिए एक्शन-केबल के साथ संयोजन में उपयोग कर सकते हैं।

this gist में, आप सर्वर-भेजे गए ईवेंट के साथ पोस्टग्रेस-पबब के लिए एक उदाहरण पा सकते हैं। इसे एक्शन-केबल संगत कोड में अनुवाद करना आसान होना चाहिए।

+0

आप @phoet धन्यवाद , कोशिश करेगा और आपको बताएगा। –

0

आप किसी तालिका (क्रिएटिव/अपडेट/डिलीट) पर एक ट्रिगर बना सकते हैं जो "चैनल" पर अधिसूचना को सक्रिय करता है, और आप घटनाओं के लिए कहा चैनल सुन सकते हैं। मैं सॉकेटक्लस्टर का उपयोग करता हूं, श्रमिकों से सुनता हूं और उपभोक्ताओं (ब्राउज़र और मोबाइल ऐप्स) पर प्रसारित करता हूं।

CREATE FUNCTION deletes_notify_trigger() RETURNS trigger 
    LANGUAGE plpgsql 
    AS $$ 
DECLARE 
BEGIN 
    PERFORM pg_notify('deletes_channel', ('DELETED' || ';;' || OLD.id)::text); 
    RETURN new; 
END; 
$$; 

और

CREATE TRIGGER deletes_trigger AFTER DELETE ON events FOR EACH ROW EXECUTE PROCEDURE deletes_notify_trigger(); 

आप किसी भी सामान आप प्रसारण डाटा पैकेट जा रहा है में चाहते हैं जोड़ सकते हैं, मेरे मामले में मैं सिर्फ रिकार्ड के आईडी की जरूरत है:

सबसे पहले आप ट्रिगर बनाना । क्रिएटिव और अपडेट के लिए आप पूरी पंक्ति या केवल कुछ चयनित कॉलम भेज सकते हैं। आप इसे पीजी 9.2 (मुझे लगता है) और उच्चतर में JSON के रूप में भी भेज सकते हैं। मैं 9.1 का उपयोग करता हूं इसलिए मैं साथ सहमत हूं ;; विभाजक।

सुनिश्चित करें कि आपका कोड आपके प्रश्नों के बीच अधिकतम 10% समय लेता है अन्यथा यदि आप जटिल जॉइन या अपडेट या अन्य ऑपरेशंस करते हैं तो आपको प्रदर्शन में महत्वपूर्ण बूंद दिखाई देगी।आप इसे जितना संभव हो सके उतना सरल और तेज़ होना चाहते हैं, इसे मूल संचालन में रखें और एप्लिकेशन परत पर भारी भारोत्तोलन करें।

फिर, द्रष्टा और प्रसारण उपभोक्ताओं के लिए (मेरे मामले नोड, socketcluster में और स्नातकोत्तर मणि, आपके मामले में आप जे एस, अजगर, रूबी, जो कुछ भी आप की तरह उपयोग कर सकते हैं)

var global_deletes = socket.subscribe('deletes_channel'); 
pg.connect(connectionString, function(err, client) { 
     client.on('notification', function(dbmsg) { 
     console.log(dbmsg.payload); 
     var payload = dbmsg.payload.split(";;"); // you can use JSON instead 

     if (payload[0] == "DELETED") { // when a DELETE is received... 
      global_deletes.publish(dbmsg.payload); 
      var tchannel = socket.subscribe('events-'+ payload[1]); // join the channel we want to broadcast 
      setTimeout(() => tchannel.publish(dbmsg.payload), 50); // send the update to all consumers 
      setTimeout(() => tchannel.unsubscribe(), 100); 
     } 
     ); 
    var query = client.query("LISTEN deletes_channel"); // turn on notifications from the server 
}); 
संबंधित मुद्दे

 संबंधित मुद्दे