/ / रेल: गणना तिथि अंतर से कैसे क्रमबद्ध करें? - रूबी-ऑन-रेल, रेल-एक्ट्रीकॉर्ड

रेल: गणना तिथि अंतर से कैसे क्रमबद्ध करें? - रूबी-ऑन-रेल, रेल-एक्ट्रीकॉर्ड

मेरे मॉडल में मेरे पास एक गणना क्षेत्र है।

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 आप यहां उल्लेख कर सकते हैं:

रेल पर रूबी एक सरणी को_पैगनेट करेगा

उम्मीद है की यह मदद करेगा।