2011-03-18 22 views
36

में कैसे ऑर्डर करने के लिए शामिल तत्वों जहां today कई tasksरेल 3

मैं एक उपयोगकर्ता के today वस्तु प्राप्त करने का प्रयास कर रहा हूँ है मैं एक मॉडल रिश्ता है, tasks शामिल हैं और उन सब को Json करने के लिए प्रस्तुत करना। यह सब तब तक बढ़िया था जब तक मैंने फैसला नहीं किया कि मैं tasks को today ऑब्जेक्ट के भीतर ऑर्डर करना चाहता था क्योंकि respond_with block का उपयोग HTML पृष्ठ को प्रस्तुत करने के लिए भी किया जाता है। tasks को शामिल करने और उन्हें ऑर्डर करने का कोई तरीका है?

मैं कुछ इस तरह कोशिश कर रहा हूँ:

class TodaysController < ApplicationController 
    respond_to :html, :json 
    def show 
    @today = Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).order(:priority).first 
    respond_with @today, :include => :tasks 
    end 
end 

यह सही ढंग से सब कुछ प्राप्त करता है, लेकिन कम से सभी कार्य ऑर्डर करने के लिए प्रतीत नहीं होता।

class TodaysController < ApplicationController 
    respond_to :html, :json 
    def show 
    @today = current_user.today 
    respond_with @today, :include => :tasks 
    end 
end 

मैं जानता हूँ कि मैं डेटा पुनः प्राप्त कर सकते हैं और इस तरह बाद में यह क्रमबद्ध करें::

@today = current_user.today 
@today.tasks.sort!{|a,b| a.priority <=> b.priority } 

यह है कि मैं क्या किया करते थे (जो महान काम किया, लेकिन आदेश नहीं था) है

यह काम करता है और मेरे परीक्षण पास करेगा, लेकिन मैं इसे हल करने के लिए ActiveRecord तरीके की उम्मीद कर रहा था। रेल में के रूप में नीचे टिप्पणी में उल्लेख किया है, 4, यह अब है:

+0

कोड की अपनी अंतिम पंक्ति के बारे में। निम्नलिखित थोड़ा स्पष्ट है: '@ आज.tasks.sort_by (&: प्राथमिकता)'। – DNNX

उत्तर

49

अपने Today मॉडल में इस प्रयास करें:

has_many :tasks, :order => 'priority DESC' 

संपादित

has_many :tasks, -> { order(:priority => :desc) } 

(more info here)

+0

यह बहुत अच्छा काम किया, धन्यवाद! – royvandewater

+5

क्या ऐसा करने का कोई और तरीका नहीं है? – maletor

+24

रेल में 4 अब इसे बहिष्कृत किया गया है, नया दृष्टिकोण 'has_many होगा: कार्य, -> {आदेश (: प्राथमिकता =>: desc)} '[इसके बारे में यहां पढ़ें] (http://stackoverflow.com/questions/ 18284606/बहिष्कृत-चेतावनी-के लिए रेल -4-मॉडल-ऑर्डर-ऑर्डर) – Cluster

35

प्रत्यक्ष priority:

से पहले tasks तालिका का नाम शामिल करना होगा
Today.where(:user_id => current_user.id).includes(:tasks).order('tasks.priority').first 
# joins(:tasks) is not required 

या, यदि आप तालिका नाम hardcoded नहीं करना चाहते, तो आप Task मॉडल से गुंजाइश के साथ विलय कर सकते हैं: where खंड खाई

Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first 
# joins(:tasks) here is required 

इसके अलावा, आप has_many: todaysUser मॉडल को जोड़ सकते हैं और कार्य करें:

current_user.todays.includes(:tasks).order('tasks.priority').first 
# or 
current_user.todays.joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first 

लेकिन आप केवल/हमेशा प्राथमिकता से ऑर्डर करने के लिए, और अन्य विभिन्न orderings जरूरत नहीं है, ०१२३०४३७७३४ को order जोड़ने की जरूरत हैआसान है।

+1

मुझे नहीं पता कि मॉडल में ऑर्डर जोड़ने का बेहतर क्यों है। ऐसा लगता है कि आदेश देखने का हिस्सा है, और उसके पास मॉडल के साथ कुछ लेना देना नहीं है। –

+0

सच है। मेरा मतलब आसान था। संपादित। – Jack

+0

@ जैक 'आज। कहीं (: user_id => current_user.id) .joins (: कार्य)। शामिल (: कार्य)।मर्ज करें (टास्क.ऑर्डर (: प्राथमिकता))। पहले यह रेल पर काम नहीं कर रहा है 4.2 – Gagan