मेरे पास विशेषताओं वाले फिल्मों का डेटाबेस है। मैं उन फिल्मों के एक प्रश्नोत्तरी बैच को यादृच्छिक क्रम में पेजिनेशन के साथ टेम्पलेट में वापस करना चाहता हूं। मैं will_paginate का उपयोग कर रहा हूँ। मैंने कोशिश की है:रेल 3, will_paginate, यादृच्छिक, दोहराव रिकॉर्ड, पोस्टग्रेर्स, सेटसीड विफलता
## MoviesController
movies = Movie.get_movies(query_string) # a method in Movie model that takes in
# a query_string and fetches movies
# with user-set params
@movies = movies.order('random()').page(params[:page]).per_page(16)
यह अच्छी तरह से काम करता है, को छोड़कर फिल्में पृष्ठ दर पृष्ठ दोहराया जाता है। इस समस्या के समाधान here और here पोस्ट किए गए हैं। वे लिंक बताते हैं कि, क्योंकि यादृच्छिक() बीज पृष्ठ से पृष्ठ पर रीसेट किया गया है, कोई स्थिरता नहीं है और OFFSET बेकार प्रदान किया जाता है। वे MySQL उपयोगकर्ताओं के लिए बहुत अच्छे समाधान प्रदान करते हैं, क्योंकि इसकी रैंड (एन) फ़ंक्शन बीज n लेता है। पोस्टग्रेस, हालांकि, ऐसा नहीं करता है। आप setseed (एन) में घोषित करने के लिए आदेश में यादृच्छिक() जारी करने से पहले का चयन करें है।
@movies = movies.select('setseed(.5)').order('random()').page(params[:page]).per_page(16)
मजे की बात है, कि लौट आए मूवी बिल्कुल नहीं विशेषताओं के साथ वस्तुओं:
तो मैं postgres तरह से बीज स्थापित करने के लिए कोशिश की। निम्नलिखित टेम्पलेट से उठाया गया था:
ActiveModel :: MissingAttributeError फिल्म # कार्रवाई
में लापता विशेषता: some_movie_attribute
मैं इस डिबग और, एक बार ढेर पर पहुंच गया action_controller/धातु, @movies निहित:
[#<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >]
मूवी ऑब्जेक्ट्स की संख्या (18) क्वेरी से लौटाई गई फिल्मों की संख्या से मेल खाती है। जैसा कि ऊपर से बाहर रखी
@movies = movies.select('setseed(.5)').page(params[:page]).per_page(16)
यह लौटे ही गैर विशेषता मूवी वस्तुओं:
मैं भी देखने के लिए अगर setseed (एन) यादृच्छिक क्रम विधि को निकाल कर समस्या थी निम्नलिखित की कोशिश की। तो ऐसा लगता है कि सेटसीड (एन) वास्तव में मुद्दा है।
मैं समाधान के एक जोड़े की कोशिश की, जैसे:
# MoviesController
movies = Movie.get_movies(query_string)
shuf_movs = movies.shuffle ## effectively turns shuf_movs into an array
@movies = shuf_movs.paginate(:page => params[:page], :per_page => 16)
कि भी दोहरा फिल्मों के साथ पृष्ठों लौट आए। मैंने सोचा था कि ऐसा इसलिए था क्योंकि पेजिनेशन को ऑब्जेक्ट्स को द्वारा ऑर्डर करने की आवश्यकता थी, और आप ऐरे # शफल में बीज सेट नहीं कर सकते। तो मैंने अपना खुद का यादृच्छिकरण कोड लिखने की कोशिश की जो अस्थायी रूप से मूवी ऑब्जेक्ट्स में ऑर्डर करने के लिए एक आईडी संग्रहीत करेगा। (कृपया मैला कोड क्षमा करें):
# Movie model
attr_accessor :rand_id
# MoviesController
movies = get_movies(query_string)
movies_count = movies.count
r = Random.new
nums = []
rand_movs = []
id = 1
while nums.count != movies_count
num = r.rand(0..movies_count - 1)
if !(nums.include?(num))
movie = movies[num]
movie.rand_id = id
rand_movs << movie
nums << num
id += 1
end
end
@movies = rand_movs.sort_by { |a| a.rand_id }.paginate(:page => params[:page], :per_page => 16)
जो अभी भी विभिन्न पृष्ठों में दोहराने वाली फिल्मों का उत्पादन करता है।इस बिंदु पर मुझे एहसास होगा कि पेजिनेट से पहले आपने जो कुछ हल किया है, वह करेगा। तो मैंने यह कोशिश की:
@movies = rand_movs.paginate(:order => 'rand_id', :page => params[:page], :per_page => 16)
जो अभी भी रिकॉर्ड दोहराता है। : ऑर्डर -> 'rand_id' को अनदेखा किया गया है क्योंकि : ऑर्डर केवल तब मायने रखता है जब आप ActiveRecord ऑब्जेक्ट्स से निपट रहे हैं, सरणी नहीं।
तो सेटसीड (एन) will_paginate का उपयोग करके यादृच्छिक गैर-दोहराव वाले रिकॉर्ड प्राप्त करने के लिए मेरी एकमात्र आशा प्रतीत होता है। कोई विचार?
धन्यवाद!
का उपयोग कर सकते हैं बीज का चयन कॉलम निर्दिष्ट करता है क्वेरी में, और आपने कोई भी नहीं, केवल बीज निर्दिष्ट किया। सुनिश्चित नहीं है कि यह काम करेगा, लेकिन इसे आजमाएं: '। चयन करें ('*, सेटसीड (1)')' – Matzi