एसोसिएशन से शीर्ष रैंक आइटम

मैं अपने संगठनों का वर्णन करके शुरू करूंगा। मेरे पास 6 संसाधन हैं। राष्ट्रीय कार्यालय, कार्यक्रम, गांव, चर्चा, बातचीत, और परिवर्तन। एक नेशनल ऑफिस में कई प्रोग्राम हैं। एक प्रोग्राम में कई गांव हैं। एक गांव में कई चर्चाएं हैं। एक चर्चा में कई वार्तालाप हैं। एक वार्तालाप में एक (belong_to) एक बदलें है।

प्रत्येक वार्तालाप में बदलें के बारे में बात की जाती है। वार्तालाप फिर बदलें रैंक देता है। यह टेबल स्कीमा है:

create_table "conversations", force: true do |t|
  t.integer  "discussion_id"
  t.integer  "change_id"
  t.integer  "rank" # 1 for 1st, 2 for 2nd, 3 for 3rd, ect.
end

मैं जो करना चाहता हूं वह निम्न है: चर्चा कक्षा से मैं शीर्ष परिवर्तन चुनने में सक्षम होना चाहता हूं। मैंने समझदारी से लागू किया है कि एक सहायक के साथ:

  def top_change discussion
    conversation = discussion.conversations.order(:rank).first
  # Incase there are no conversations for the discussion
    if conversation.respond_to?('change')
      conversation.change.name 
    else
      'N/A'
    end
  end

यदि मैं इसे गांव कक्षा में ले जाता हूं तो मुझे कोई समस्या है। मैं Village में सभी चर्चा से कैसे जाउंगा और शीर्ष स्कोरिंग बदलें ढूंढूं? प्रोग्राम कक्षा पर प्रयास करते समय भी मुझे वही समस्या होगी। और फिर नेशनल ऑफिस कक्षा।

यह एसक्यूएल या activerecord के माध्यम से प्राप्त किया जा सकता है - मैं निश्चित नहीं हूँ।

मुझे आशा है कि मैंने खुद को स्पष्ट कर दिया है - मुझे कभी-कभी स्पष्टता के साथ समस्याएं होती हैं।


संपादित करें:

यह स्पष्ट किया गया है कि मैंने रैंकों को सही ढंग से समझाया नहीं है। अब मैं यह बताने की कोशिश करूंगा कि वे कैसे काम करते हैं:

प्रत्येक वार्तालाप में एक रैंक है। प्रत्येक वार्तालाप एक विशिष्ट बदलें के बारे में है। इसलिए, यदि वार्तालाप बदलें 1 के बारे में चर्चा * बदलें * 1 में पहला स्थान प्राप्त होगा। बदलें बदलें 1 के बारे में चर्चा दूसरे स्थान पर है। तो बदलें 1 में अब पहला और दूसरा (3 अंक?) है।

2 चर्चाएं प्रत्येक में वार्तालाप है जो बदलें के बारे में बात करता है 2. एक इसे दूसरे तीसरे स्थान पर रखता है। बदलें 2 में पहला और तीसरा (4 अंक?) है

कुल मिलाकर, बदलें 1 शीर्ष परिवर्तन था - इसमें बदलें 2 से कम अंक (उच्च स्कोरिंग) था।

उम्मीद है कि यह स्पष्ट है। यह केवल संदर्भ के लिए, जिथब पर पूरा एप्लिकेशन है।

1
जोड़ा संपादित
विचारों: 1
अपना पहला स्टैक ओवरफ्लो प्रश्न होने के लिए, यह वास्तव में एक अच्छी तरह से गठित प्रश्न है। बधाई।
जोड़ा लेखक Nobita, स्रोत
आपके अपडेट के आधार पर, आपको केवल एक सॉर्टिंग की तुलना में कुछ और उन्नत चाहिए। आपको एक सारांश और फिर एक सॉर्टिंग की आवश्यकता है। जवाब मोटे तौर पर इस तरह कुछ दिखाई देगा: stackoverflow.com/questions/14997289/… यदि मेरे पास और समय है, तो मैं एक पूर्ण समाधान दूंगा।
जोड़ा लेखक Farley Knight, स्रोत

2 उत्तर

मैं फ़िरोडोड आईआरसी नेटवर्क पर # रूब्योनराइल्स चैनल में जेम्स स्ट्रॉन्ग के साथ जवाब के माध्यम से काम करना समाप्त कर दिया। यहां हमें क्या मिला है:

परिवर्तन मॉडल में हमने दो कार्यवाही जोड़े:

def self.with_rank(load_conversation=true)
  q = select("changes.*, SUM(11 - conversations.rank) as score").group("changes.id")
  q = q.joins(:conversations) if load_conversation
  return q
end

यह परिवर्तन से जुड़े सभी वार्तालापों के माध्यम से चला गया, फिर यह सभी रैंकों को छेड़छाड़ कर दिया (लेकिन हमने इसे बनाया ताकि उच्च बेहतर हो। आईई अगर रैंक 1: 1 - 11 = 10 था) और इसे तालिका में * बातचीत_रैंक के रूप में डालें *। फिर यह बातचीत तालिका के साथ परिवर्तन तालिका में शामिल हो जाता है।

def self.top_ranked(load_conversation=true)
  with_rank(load_conversation).order("score desc").limit(1)
end

यह अगला छोटा स्निपेट शीर्ष रैंकिंग परिवर्तन देता है। यह सुंदर आत्म व्याख्यात्मक है।

गांवों के मॉडल में हमने एक ऐसी क्रिया जोड़ी जो उस मॉडल (Villages.changes) के परिवर्तनों के साथ top_rank क्वेरी को विलय कर दिया।

def top_change
  changes.merge Change.top_ranked(false)
end

इसमें निम्नलिखित सहयोग भी था:

has_many :conversations, through: :discussions

इससे मुझे शीर्ष परिवर्तन का नाम प्राप्त करने के लिए निम्न कार्य करने की अनुमति मिलती है:

@village.top_change.name

इस अनुभव से मैंने जो सबसे बड़ी चीज ली है, वह इसे छोटे प्रबंधनीय हिस्सों में इस तरह के बड़े प्रश्नों को तोड़ने के लिए है। इसके लिए हमने कहा:

  1. रूपांतरणों (उनके स्कोर संयुक्त) के आधार पर रैंक के साथ परिवर्तन प्राप्त करें
  2. उच्चतम रैंक प्राप्त करें
  3. गांव के भीतर उच्चतम रैंक प्राप्त करें

आईआरसी में जस्टोंग करने के लिए धन्यवाद और उन सभी जिन्होंने मदद की।

0
जोड़ा

आप has_many का उपयोग कर सकते हैं: इसे प्राप्त करने के लिए।

http://ryandeussing.com/blog/ 2013/06/12/नेस्ट-संघों और है-कई के माध्यम से/

Has_many के माध्यम से 3 या अधिक टेबल के बीच जुड़ने के लिए अतिरिक्त सशर्त जोड़ देगा। तो आप इसे "उपरोक्त" वार्तालाप के सभी वर्गों के लिए उपयोग करने में सक्षम होना चाहिए।

असल में आप चेन has_many कर सकते हैं: कई बार आप किसी भी संबंधित मॉडल के लिए शीर्ष वार्तालाप खोजने की जरूरत है।

आपके मॉडल में:

class Discussion < AR::Base
  belongs_to :village
  has_many :conversations
end

class Conversation < AR::Base
  belongs_to :discussion
  has_one :change
end

class Village < AR::Base
  has_many :discussions
  has_many :conversations, through: :discussions
end

class Programme < AR::Base
  has_many :villages
  has_many :conversations, though: :villages
end

आपके नियंत्रक में:

class VillageController < ApplicationController
  def top_change
    village = Village.find(params[:id])
    @change = village.conversations.order(:rank).first.change
  end
end

class ProgrammesController < ApplicationController
  def top_change
    programme = Programme.find(params[:id])
    @change   = programme.conversations.order(:rank).first.change
  end      
end
0
जोड़ा
क्या आप समझाने में सक्षम होंगे कि आपने क्या किया है। मुझे समझ में परेशानी हो रही है।
जोड़ा लेखक Jragon, स्रोत
इसके अलावा, परिवर्तन रैंक कॉलम नहीं है। केवल बातचीत ही करते हैं।
जोड़ा लेखक Jragon, स्रोत
हम्म। इसे देखकर मैं 100% निश्चित नहीं हूं कि मैं समझता हूं कि यह कैसे काम करेगा। मैं खुद को स्पष्ट करने में असफल रहा हूं: प्रत्येक गांव में एक से अधिक चर्चाएं होती हैं। तो अगर मैं programme.conversations.order (: रैंक) करना चाहता था तो क्या यह एकाधिक 1 और एकाधिक 2nds के साथ वार्तालापों की एक सूची वापस नहीं करेगा?
जोड़ा लेखक Jragon, स्रोत
संपादन में मैंने उम्मीदों के बारे में कुछ और समझाया है।
जोड़ा लेखक Jragon, स्रोत
मैंने जवाब देने से पहले मैंने पूरी तरह से प्रश्न नहीं पढ़ा। मैं इसे संपादित कर रहा हूं क्योंकि मैं इसे और अधिक धीरे-धीरे पढ़ रहा हूं।
जोड़ा लेखक Farley Knight, स्रोत
खैर, मुझे लगता है कि यह होगा। यह शायद एक अनुप्रयोग-स्तरीय समस्या है, क्योंकि मुझे समझ में नहीं आता कि बातचीत में आपके रैंक कैसे वितरित किए जाते हैं। शायद इसके बारे में आपके प्रश्न में और अधिक जोड़ें?
जोड़ा लेखक Farley Knight, स्रोत