आदेशों के साथ रेल 4 has_many के लिए चेतावनी दी गई है


105
class RelatedList < ActiveRecord::Base
  extend Enumerize

  enumerize :list_type, in: %w(groups projects)

  belongs_to :content
  has_many :contents, :order => :position

end

मेरे पास मेरे रेल ऐप में यह मॉडल है जो कंसोल में रिकॉर्ड बनाने की कोशिश करने पर चेतावनी फेंकता है।

चेतावनी चेतावनी: आपके संबंधित सूची में निम्नलिखित विकल्प। कृपया इसके बजाय एक स्कोप ब्लॉक का उपयोग करें। उदाहरण के लिए, निम्न: has_many: spam_comments, conditions: {स्पैम: true}, class_name: 'टिप्पणी' को निम्नलिखित के रूप में फिर से लिखा जाना चाहिए: has_many: spam_comments, -> {जहां स्पैम: true}, class_name: 'टिप्पणी'। (यहां से बुलाए गए

ऐसा लगता है जैसे रेल्स 4 में नए हैं: मॉडल में उपयोग के लिए सिंटैक्स। लेकिन मैं रेल गाइड में प्रलेखन नहीं ढूंढ सकता।

जवाबों:


250

रेल 4 में, :orderपदावनत कर दिया गया है और आपको लैंबडा स्कोप ब्लॉक के साथ प्रतिस्थापित करने की आवश्यकता है जैसा कि आपने प्रश्न में पोस्ट की गई चेतावनी में दिखाया है। एक और ध्यान देने वाली बात यह है कि इस स्कोप ब्लॉक को किसी अन्य एसोसिएशन विकल्प जैसे dependent: :destroy आदि से पहले पारित करने की आवश्यकता है ।

इसे आजमाइए:

has_many :contents, -> { order(:position) }

आदेश दिशा निर्दिष्ट करने के लिए, यानी या तो ascया desc@ यहोशू-Coady और के रूप में @wsprujit सुझाव दिया है, उपयोग करें:

has_many :contents, -> { order 'position desc' }

या, हैश शैली का उपयोग कर:

has_many :contents, -> { order(position: :desc) }

इसके लिए सक्रिय रिकॉर्ड स्कोपhas_many पर आगे संदर्भ ।


3
शानदार काम करता है! मुझे गाइड या डॉक्स में ऐसी जानकारी कहां मिल सकती है? मैं एक नहीं मिल सकता है। धन्यवाद।
शंकरादेवी


4
यदि आपके पास एक से अधिक पदावनत विकल्प हैं, तो क्या कहें oderऔर include? यह: { order(:position), include(:track) }अल्पविराम पर त्रुटि फेंकता है।
काकूबाई

2
-> { order(name: :asc) }
Asc

1
यदि किसी कारण से, आप केवल संग्रह को कुछ समय के लिए ऑर्डर करना चाहते हैं, तो आप ऐसा भी कर सकते हैं, list.contents.order('position desc')जो समग्र रूप से अधिक कुशल हो सकता है, न कि मॉडल के रूप में घुसपैठ करने वाला (वोट किए गए उत्तर में, सूची सामग्री के एक क्षेत्र को जानता है, यहां नियंत्रक इसे जानता है। )
डर्टी हेनरी

35

मुझे यह पता लगाने में कुछ समय लगा कि मुझे ऑर्डर कैसे करना है और इसमें शामिल हैं, मैंने अंततः पाया कि आप स्कोप स्टेटमेंट्स को चेन करते हैं ,

has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing"

2
यह वास्तव में मेरा मुद्दा था। मूल विशेषता द्वारा has_many संबंध ऑर्डर करने का तरीका जानने की कोशिश कर रहा है। एहसास नहीं था कि आप ऐसा कर सकते हैं और फिर ऑर्डर कर सकते हैं। धन्यवाद!
टिमोथीशॉ

27

मैंने सोचा था कि यदि आपके पास कोई विकल्प हैश तर्क हैं, तो उन्हें लंबोदर के बाद जाना होगा, जैसे:

has_many :things, -> { order :stuff }, dependent: :destroy

मुझे यह पता लगाने के लिए एक मिनट का समय लगा - उम्मीद है कि यह किसी और को इस समस्या के आने में मदद करता है।


3
यह "वस्तु" संघों के बारे में भी सच है जो वस्तु पर मौजूद हो सकते हैं -has_many :items, -> { order 'name' }, through: :suppliers
मेजर मेजर

0

यह मेरे लिए 4 और MongoDB रेल के साथ काम करता है

has_many :discounts, order: :min_amount.asc

-4

वैकल्पिक रूप से, आप orderमॉडल पर क्लॉज़ लगा सकते हैं , उदाहरण के लिए:

has_many :options, order: 'name' # In class Answer

हो जाता है

has_many :options # In class Answer

default_scope { order 'name' } # In class Option

PS: ArgumentError: wrong number of arguments (1 for 0)जब मैं कर रहा था has_many :things, -> {}


4
डिफ़ॉल्ट स्कोप का उपयोग न करें। यदि आप इसे करने के लिए उपयोग किए जाते हैं, तो आप उस मैजिक विधि में और अधिक तर्क जोड़ सकते हैं। भविष्य में इसे ओवरराइड करना कठिन है।
ग्रेजेगॉर zuszczek
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.