2011-04-06 14 views
6

कहें कि मुझे Questions और Answer मॉडल मिला है और मैं सभी उत्तरों को एक विशिष्ट प्रश्न पर खींचता हूं।रेल: रिकॉर्ड की नियुक्ति प्राप्त करें?

मैं आसानी से each_with_index कर सकता हूं और यह पता लगा सकता हूं कि उत्तर का सूचकांक या "प्लेसमेंट" क्या है (उस विशिष्ट प्रश्न के अन्य उत्तरों के संबंध में)।

लेकिन, मैं कहता हूं कि मैं एक विशिष्ट उत्तर प्राप्त करना चाहता हूं ... मैं अभी भी यह कैसे पता लगा सकता हूं कि उस उत्तर की अनुक्रमणिका किसी अन्य प्रश्न से जुड़े अन्य सभी उत्तरों के संबंध में क्या है।

उदाहरण Answer डेटा:

ID text  question_id 
23 awesome 3 
27 boooyah 3 
38 snap  3 

तो मैंने किया था Answer.find(27) मैं कैसे पता लगा सकते हैं दूसरे मद (यह मानते हुए मैं आईडी के आधार पर आदेश देने से हूँ ... हालांकि मैं किसी भी क्षेत्र से आदेश कर सकते हैं) है कि रिकॉर्ड।

+0

स्थिति वास्तव में महत्वपूर्ण है कि आप तो बस अपनी तालिका में एक स्थान स्तंभ जोड़ने के लिए है। – corroded

+0

लेकिन इसे गतिशील होना चाहिए। जैसे कि अगर मैं 'create_at' द्वारा ऑर्डर करता हूं तो वह स्थिति बदल देता है। मैं उन्हें एक निश्चित क्रम में रखना नहीं चाहता हूं, मैं यह जानना चाहता हूं कि वे एक विशिष्ट क्रम में कहां हैं। – Shpigford

+0

जब तक आपने डेटाबेस में स्थिति को सहेज नहीं लिया, जैसा कि मैंने सुझाव दिया था। यदि आपने स्थिति को सहेज लिया है, तो बूओयाह में हमेशा स्थिति 2 होगी, इससे कोई फर्क नहीं पड़ता कि आपकी क्वेरी – corroded

उत्तर

6
class Answer < ActiveRecord::Base 
    belongs_to :question 

    def position(column = 'id', order = 'ASC') 
    order_by = "#{column} #{order}" 
    arrow = order.capitalize == "ASC" ? "<=" : ">=" 
    question.answers.where("#{column} #{arrow} (?)", self.send(column)).order(order_by).count 
    end  
end 

Answer.find(27).position 
Answer.find(27).position("updated_at") 
Answer.find(27).position("updated_at", "DESC") 
+0

यह केवल 'id' द्वारा सॉर्ट करने के लिए काम करेगी। किसी और चीज से ऑर्डर करना एक ही प्रभाव होगा क्योंकि आप 'कहाँ (' id <=? ', Self.id)' स्थिति को हमेशा लागू कर रहे हैं और फिर गिनती प्राप्त कर रहे हैं। – ctcherry

+0

हाँ, मेरी गलती। – fl00r

+0

अब * वह * काम करेगा, और सहमत होगा 'गिनती' अधिक प्रदर्शनकारी है। – ctcherry

1

ऐसा कुछ काम करना चाहिए, यह परीक्षण नहीं किया गया है लेकिन आप अवधारणा को देख सकते हैं।

class Answer < ActiveRecord::Base 

    belongs_to :question 

    def placement(ordering_by => 'id ASC') 
    question.answers.order(ordering_by).index(self) 
    end 

end 
+0

एसक्यूएल 'गिनती' का उपयोग करके अधिक perfomance कुशल – fl00r

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