2010-05-19 11 views
5

मुझे एक जटिल खोज करते समय will_paginate के साथ समस्या का सामना करना पड़ रहा है।रेल: एक जटिल एसोसिएशन के साथ will_paginate का उपयोग

:photo has_many :tags, :through => :tagships 
:item has_many :photos 
:photo belongs_to :item 


@photos = @item.photos.paginate :page => params[:page], 
           :per_page => 200, 
           :conditions => [ 'tags.id IN (?)', tag_ids], 
           :order => 'created_at DESC', 
           :joins => :tags, 
           :group => "photos.id HAVING COUNT(DISTINCT tags.id) = #{tag_count}" 

मैं उन सभी फ़ोटो को लाने के लिए चाहता हूं जिनके पास टैग_आईड्स सरणी में सभी टैग हैं। MySQL का IN आमतौर पर "या" खोज करता है, लेकिन मुझे "और" चाहिए। मैंने पाया कि "और" व्यवहार here की नकल करने के लिए आईएन को संशोधित करने के लिए कैसे पाया गया है और यह model.find() का उपयोग करते समय ठीक काम करता है, तब तक काम करता है जब तक रिकॉर्ड्स की संख्या मेरे: per_page गिनती से कम होती है। लेकिन अगर इसे अंकनित करना है, तो जेनरेट किया गया एसक्यूएल इसी प्रकार है:

SELECT count(*) AS count_all, photos.id HAVING COUNT(DISTINCT tags.id) = 1 AS photos_id_having_count_distinct_tags_id_1 FROM `photos`(...) 

जो काम नहीं करता है। अन्य ने इस बग को देखा है और क्वेरी के बाहर अपनी गिनती() को स्थानांतरित करने में सक्षम थे, लेकिन मुझे नहीं लगता कि यह मेरे मामले में संभव है।

क्या इस खोज को करने का कोई बेहतर तरीका है जो will_paginate के साथ काम कर सकता है? अगर ऐसा करने का एकमात्र तरीका है, तो मुझे लगता है कि मुझे एक और पेजिनेशन प्लगइन देखना चाहिए?

धन्यवाद!

उत्तर

4

FYI करें, यहाँ है कि मैं क्या अंत में इसे ठीक करने के लिए मिला:

@photos = WillPaginate::Collection.create(current_page, per_page) do |pager| 
    result = @item.photos.find :all, :conditions => [ 'tags.id IN (?)', tag_ids] ,:order => 'created_at DESC', :joins => :tags, :group => "photos.id HAVING COUNT(DISTINCT tags.id) = #{@tags.count}", :limit => pager.per_page, :offset => pager.offset 
    pager.replace(result) 

    unless pager.total_entries 
     pager.total_entries = @item.photos.find(:all, :conditions => [ 'tags.id IN (?)', tag_ids] ,:order => 'created_at DESC', :joins => :tags, :group => "photos.id HAVING COUNT(DISTINCT tags.id) = #{@tags.count}").count 
    end 
    end 

आप मैन्युअल रूप पेज नंबर का उपयोग कर पृष्ठवार सेट का निर्माण करने के लिए है एक ऑफसेट और एक में शामिल होने क्वेरी बनाने के लिए टैग का उपयोग। किंडा गुंजाइश

1

इस पर मेरा पहला स्टैब (माफ करना अभी इसका परीक्षण करने का समय नहीं है ... अगर मैं करता हूं तो अपडेट हो जाएगा) निम्नलिखित में से कुछ होगा (जोड़ा गया: चुनें और बदल गया: समूह):

@photos = @item.photos.paginate :page => params[:page], 
           :per_page => 200, 
           :select => "photos.*, COUNT(DISTINCT tags.id) AS tag_count", 
           :conditions => [ 'tags.id IN (?)', tag_ids ], 
           :order => 'created_at DESC', 
           :joins => :tags, 
           :group => "photos.id HAVING tag_count = #{tag_count}" 
संबंधित मुद्दे