मेरे मॉडल में मेरे पास एक गणना क्षेत्र है।
class Products < ApplicationRecord
attr_reader :days
def days
(Date.today - self.created_at).to_i
end
end
जब मैं इसे हल करने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है।
@products = Product.all.order("days").paginate(:page => params[:page], :per_page => 15)
त्रुटि:
PG::UndefinedColumn: ERROR: column "days" does not exist
अगर कोई मुझे दिखाएगा कि गणना किए गए क्षेत्र के आधार पर कैसे क्रमबद्ध किया जाए तो मैं सराहना करूंगा?
उत्तर:
उत्तर № 1 के लिए 1रेल क्रम खंड पैरामीटर कॉलम तालिका में मौजूद होना चाहिए, मॉडल में उपयोगकर्ता परिभाषित कस्टम विशेषता के लिए समर्थन नहीं करता है। तो, आपको रूबी का उपयोग करना होगा इसके अनुसार क्रमबद्ध करें नीचे परिभाषित कस्टम परिभाषित विशेषताओं के लिए विधि,
Product.all.sort_by(&:days)
और आपको अपनी विधि को नीचे की तरह बदलना होगा,
def days
DateTime.now.to_i - self.created_at.to_i
end
यह सिर्फ काम करेगा लेकिन कस्टम उपयोगकर्ता परिभाषित कस्टम विशेषता के आधार पर रिकॉर्ड को सॉर्ट करने का यह सबसे अच्छा अभ्यास नहीं है। इसलिए, आपको इस तर्क को एसक्यूएल क्वेरी में नीचे ले जाना है,
Product.all.order("now() - created_at")
यह पोस्टग्रेज़ पर काम करता है, MySQL के बारे में निश्चित नहीं है, अगर काम नहीं कर रहा है तो कृपया mysql में वैकल्पिक जांचें।
उत्तर № 2 के लिए 1
उपरोक्त आपके कोड के लिए समस्या attr_reader है: दिन, इस बीच आप जिस विधि को विधि के रूप में घोषित नहीं करते हैं
आपकी समस्या के लिए यहां मेरा विचार है
आपके मॉडल में
class Products < ApplicationRecord
def total_days
(Date.today - self.created_at).to_i
end
def self.sorted_by_days
Product.all.sort_by(&:total_days).reverse
# just delete .reverse incase you want ascending
# I put reverse in case you want to sort descending
end
end
आपके नियंत्रक में
@products = Product.sorted_by_days.paginate(:page => params[:page], :per_page => 15)
उत्तर № 3 के लिए 1
मुझे यकीन नहीं है कि आप कोड के इस टुकड़े को कैसे चला रहे हैं:
(Date.today - self.created_at).to_i
क्योंकि यह एक संख्यात्मक मूल्य की अपेक्षा करता है -
संकेत। मैं इसे ऐसा करने में सक्षम था:
((Time.zone.now - self.created_at) / 1.day).to_i
लेकिन मुख्य बिंदु यह है कि मुझे लगता है कि आप रिकॉर्ड को ऑर्डर करना चाहते हैं created_at
तारीख। तो डिफ़ॉल्ट रूप से यह आरोही है और आप उन रिकॉर्ड्स को प्रदर्शित करना चाहते हैं जिन्हें हाल ही में बनाया गया है ताकि आप इसे सीधे इस तरह कर सकें:
Product.all.order(:created_at)
और यदि आप इसे अवरोही क्रम में चाहते हैं तो आप इसे इस तरह से कर सकते हैं:
Product.all.order(created_at: :desc)
फिर भी अगर आपको जरूरत है sort
यह एक द्वारा attr_reader
अन्य उत्तरों बताते हैं कि आप इसे कैसे कर सकते हैं। बस मुद्दा यह होगा कि pagination
उस पर काम ActiveRecord::Collection
इसके लिए सरणी के बजाय will_paginate
आप यहां उल्लेख कर सकते हैं:
रेल पर रूबी एक सरणी को_पैगनेट करेगा
उम्मीद है की यह मदद करेगा।