2015-04-17 18 views
6

ऑर्डर करने के लिए दायरा कैसे बनाया जाए,शीर्षक

मैं शीर्षक (शीर्षक) द्वारा क्रमबद्ध करने के लिए एक ऐसा दायरा बनाने की कोशिश कर रहा हूं। शीर्षक कॉलम पोस्ट मॉडल में रहता है। मैंने सक्रिय रिकॉर्ड पूछताछ अनुभाग और one on StackOverFlow पर scopes section के माध्यम से पढ़ा लेकिन यह बिल्कुल स्पष्ट नहीं है। क्या कोई मुझे सही दिशा में संभवतः इंगित कर सकता है?

मैं 4 मॉडल है:

scope :ordered_by_title, -> { order(title: :asc) } 

जब आप तो आप एक order साथ default_scope है: टिप्पणी पोस्ट उपयोगकर्ता विज्ञापन

class Post < ActiveRecord::Base 
attr_accessible :body, :title, :user 
has_many :comments 
belongs_to :user 
default_scope {order('created_at DESC')} 
scope :ordered_by_title {order('title')} #What I initially built 

end 

उत्तर

28

जब आप किसी भी default_scopeorder साथ की जरूरत नहीं है reorder का उपयोग करने की आवश्यकता है:

default_scope { order(created_at: :desc) } 
scope :ordered_by_title, -> { reorder(title: :asc) } 

या orderunscope साथ:

default_scope { order(created_at: :desc) } 
scope :ordered_by_title, -> { order(title: :asc).unscope(:order) } 

reorder विधि डिफ़ॉल्ट गुंजाइश आदेश ओवरराइड करता है।

+0

मेरे लिए यह स्पष्ट करने के लिए धन्यवाद, यह काम करता है मैंने इसे रेल कंसोल में अभी कोशिश की है! मैं इसे अपने गिस्ट नोट्स में जोड़ रहा हूं :) – SaintClaire33

9

दुर्भाग्य से सरल order काम नहीं करेगा। सक्रिय रिकॉर्ड आपको एक ही एसोसिएशन पर एकाधिक ऑर्डर निर्दिष्ट करने की अनुमति देता है (जो पहले created_at कॉलम और फिर title द्वारा ऑर्डर करेगा - दूसरा ऑर्डर इस मामले में कुछ भी नहीं बदलेगा)। आपको रेलवे को बताने की जरूरत है कि आप reorder विधि का उपयोग कर पिछले ऑर्डर स्टेटमेंट को अनदेखा करना चाहते हैं।

scope :ordered_by_title, -> { reorder(title: :asc) } 
+0

इसे और अधिक दृश्यता की आवश्यकता है! यदि आपके ActiveRecord एसोसिएशन के पास पहले से ही एक ऑर्डर है तो 'रीडर' का उपयोग करें। यह बहुत संभव है कि यदि आपको अपने आप को 'मॉडल' के बजाय 'रीडर' का उपयोग करने की आवश्यकता है, तो आपके मॉडल में एक डिफ़ॉल्ट दायरा है, जो नो-नो है। –

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