2011-09-12 14 views
40

मेरे ऐप में फ़ोटो हैं जो उपयोगकर्ताओं से संबंधित हैं।रेल: अगला/पिछला रिकॉर्ड प्राप्त करें

एक फोटो में # शो व्यू में मैं "इस उपयोगकर्ता से अधिक" दिखाना चाहता हूं, और उस उपयोगकर्ता से अगली और पिछली तस्वीर दिखाऊंगा। id ऑर्डर या अगली/पिछली तस्वीर created_at ऑर्डर में अगली/पिछली तस्वीर होने के साथ मैं ठीक हूं।

आप एक अगली/पिछली तस्वीर के लिए, या कई अगली/पिछली तस्वीरों के लिए इस प्रकार की क्वेरी कैसे लिखेंगे?

अगले तस्वीर के लिए::

+0

यह मणि पूरी तरह से मेरे लिए काम करता है। http://stackoverflow.com/a/25712023/683157 – kuboon

उत्तर

80

इस प्रयास करें:

class User 
    has_many :photos 
end 


class Photo 
    belongs_to :user 

    def next 
    user.photos.where("id > ?", id).first 
    end 

    def prev 
    user.photos.where("id < ?", id).last 
    end 

end 

अब आप:

photo.next 
photo.prev 
+0

पिछला ठीक से इस तरह से काम नहीं करता है, user.photos.where ("id igrek

+3

@igrek I जवाब तय कर दिया है। आम तौर पर, मैं 'अंतिम' कॉल का उपयोग करने से बचता हूं क्योंकि आपके पास एक बड़ा डेटा सेट है (http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the- क्वेरी से नीचे)। मैं अंतिम पंक्तियों को प्राप्त करने के लिए 'ORDER BY आईडी डीईएससी 'खंड का उपयोग करता हूं। –

+0

सीमा (1) का उपयोग करने के बारे में कैसे? –

2

आप जहां विधि में कुछ विकल्प पारित कर सकते हैं

Photo.where(:user_id => current_user.id, :created_at > current_photo.created_at).order("created_at").first 

पिछला तस्वीर

Photo.where(:user_id => current_user.id, :created_at < current_photo.created_at).order("created_at").last 

मैं प्रथम/अंतिम मिश्रित हो सकता है।

8

सुनिश्चित नहीं हैं कि अगर इस रेल में 3.2+ एक परिवर्तन है, लेकिन इसके बजाय का:

model.where("id < ?", id).first 
के लिए

पिछला। आप

.where("id > ?", id).last 

क्या करना है ऐसा लगता है कि "आदेश से" गलत है, इसलिए पहले, डीबी में पहले रिकॉर्ड आप दे आप 3 आइटम वर्तमान की तुलना में कम है, तो है क्योंकि [1,3,4 ], तो "पहला" 1 है, लेकिन आखिरी वह है जिसे आप ढूंढ रहे हैं। आप कहां के बाद एक प्रकार का आवेदन कर सकते हैं, लेकिन यह एक अतिरिक्त कदम है।

+1

शून्य के साथ क्या। यह सही काम करता है? – jwilcox09

+0

मैं इस काम की पुष्टि कर सकता हूं। – Hendrik

3
class Photo < ActiveRecord::Base 
    belongs_to :user 
    scope :next, lambda {|id| where("id > ?",id).order("id ASC") } # this is the default ordering for AR 
    scope :previous, lambda {|id| where("id < ?",id).order("id DESC") } 

    def next 
    user.photos.next(self.id).first 
    end 

    def previous 
    user.photos.previous(self.id).first 
    end 
end 

तो फिर तुम कर सकते हैं:

photo.previous 
photo.next 
1

आप Nexter जांच करना चाह सकते। यह आपके मॉडल में एक हार्डकोड पर निर्भर होने के बजाय किसी भी गतिशील रूप से बनाए गए दायरे पर काम करता है।

+0

मैंने उसी व्यवहार के साथ मणि बनाया है, लेकिन अन्य दृष्टिकोण: https://github.com/dmitry/proximal_records –

12

यह मुझे मेरी समस्या के समाधान के लिए भी नेतृत्व करता है। मैं किसी आइटम के लिए अगला/पिछला बनाने की कोशिश कर रहा था, कोई संगठन शामिल नहीं था।

def next 
    Item.where("id > ?", id).order("id ASC").first || Item.first 
    end 

    def previous 
    Item.where("id < ?", id).order("id DESC").first || Item.last 
    end 

इस तरह उसके चारों ओर लूप होता है, पिछले आइटम यह पहले एक और दूसरी तरह के आसपास के लिए चला जाता से: अपने मॉडल में कुछ इस तरह कर रही है समाप्त हो गया। मैं बाद में अपने विचारों में @item.next पर कॉल करता हूं।

+0

चक्र पुनरावृत्ति के लिए बहुत बढ़िया है। –

+0

नाइस, एक चक्र की तलाश में था! – gregblass

1
class Photo < ActiveRecord::Base 
    belongs_to :user 

    default_scope { order('published_at DESC, id DESC') } 

    def next 
    current = nil 
    user.photos.where('published_at >= ?', published_at).each do |p| 
     if p.id == id then break else current = p end 
    end 
    return current 
    end 

    def previous 
    current = nil 
    user.photos.where('published_at <= ?', published_at).reverse.each do |p| 
     if p.id == id then break else current = p end 
    end 
    return current 
    end 
end 

मुझे पता चला कि यहां पहले से ही मेरे उत्तर की सेवा नहीं हुई है। कल्पना कीजिए कि आप प्रकाशित तिथि के आधार पर पिछले या अगले चाहते हैं, लेकिन कुछ तस्वीरें उसी तारीख को प्रकाशित की जाती हैं। यह संस्करण फ़ोटो पर दिए गए क्रम में फ़ोटो के माध्यम से लूप करेगा, और संग्रह में वर्तमान के पहले और बाद में ले जाएगा।

संबंधित मुद्दे