2010-06-15 118 views
0

我在rails 2.3.8和will_paginate插件上使用ruby。分頁前是否可以按條件進行過濾?

我剛剛注意到,如果我寫的東西是這樣的:

Announcement.paginate :page => params[:page], :per_page => 10, :conditions => some_condition 

它會奏效。

但是,如果我寫的東西是這樣的:

announcements = Announcement.all :conditions => some_condition 
@ann = announcements.paginate :page => params[:page], :per_page => 10 

它不會承認的條件。

編輯:

我已經開發了搜索功能,並且,由於排序功能,我不得不實施,我不得不把搜索壯舉模型的方法中每次都從控制器叫它我需要搜索或按某個字段排序。

所以,我的模型的方法是這樣的:

def self.search_by_relevance(words) 
    conditions = get_search_conditions(words) 

    Announcement.published.descend_by_featured.order_by_rate :conditions => conditions 
    end 

其中「出版」和「order_by_rate」的命名範圍和「descend_by_feature」屬於「searchlogic」寶石。

def self.get_search_conditions(words) 
    unless words.empty? or words.nil? 
     conditions = '' 

     words.each do |word| 

     if conditions.nil? or conditions.empty? 
      conditions = '(title like "%' + word + '%" or description like "%' + word + '%")' 
     else 
      conditions += ' and (title like "%' + word + '%" or description like "%' + word + '%")' 
     end 
     end 

     conditions 
    end 
    end 

我的控制器的動作看起來是這樣的:

def search 
    @announcements = Announcement.search_by_relevance(params[:txtSearch].to_s.split).paginate :page => params[:page], :per_page => 10 unless params[:txtSearch].nil? or params[:txtSearch].empty? 
end 

此語法將無法識別模型的方法規定的條件。

編輯2:

感謝您的帖子。再測試一下我的代碼我發現如果我在這行Announcement.published.descend_by_featured.order_by_rate :conditions => conditions的「order_by_rate」後面寫上「.all」,在search_by_relevance方法中它會返回正確的查詢,但是will_paginate插件會給我下面的錯誤(如果我加上「以上的通過率‘):

NoMethodError in AnnouncementsController#search 

undefined method `to_i' for {:page=>nil, :per_page=>10}:Hash 

D:/Proyectos/Cursometro/www/vendor/plugins/will_paginate/lib/will_paginate/collection.rb:15:in `initialize' 
D:/Proyectos/Cursometro/www/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb:37:in `new' 
D:/Proyectos/Cursometro/www/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb:37:in `paginate' 
D:/Proyectos/Cursometro/www/app/controllers/announcements_controller.rb:276:in `search' 

首先,我不明白爲什麼我要了’。所有」添加到查詢工作的權利;第二,我不明白爲什麼will_paginate當我包含「.all」(我也嘗試添加下面的代碼但沒有工作::page => params[:page] || 1)時將不起作用。

另外,如果我包括 「所有」 語法來查詢,它將返回:

SELECT * FROM announcements WHERE ((標題,如 「%anuncio%」 或 描述,如「% anuncio%「))AND (announcements.state = '出版') ORDER BY announcements.featured DESC

如果我不這樣做,它會返回:

SELECT * FROM announcements WHERE (announcements.state ='published') ORDER BY公告。特色DESC

您是否看到最後一條中沒有包含條件?這是造成這個問題的原因。

+0

我錯過了什麼?我的理解是:條件行爲就像一個SQL WHERE語句,所以技術上你首先用標準語法過濾條件... – ghoppe 2010-06-15 00:38:27

+0

是的,但在這種情況下它不起作用... – 2010-06-15 01:17:44

+0

我編輯了我的答案...希望它可以幫助你:] – 2010-06-15 02:17:50

回答

0

我不知道這是否會爲你工作,但你可以使用paginate就像find,我的意思是,是這樣的:

@announcements = Announcement.paginate_all_by_id params[:id], 
    :page => params[:page], :per_page => 10 

編輯

@announcements是一個數組,對?

那麼,我發現this文章和this另一個可以幫助你。

+0

我需要先獲取條件過濾的記錄,然後對它們進行分頁。分兩步。 – 2010-06-15 00:32:08

+0

嗯。我以爲你只是不想加載所有'Annoucements' – 2010-06-15 00:42:35

+0

我編輯了我的文章與更新的信息。 – 2010-06-15 12:46:00

0

嗯,我通過在模型的方法中添加「.paginate」(而不是「.all」)來解決這個問題,通過參數傳遞「page」和「per_page」值。在模型中加入分頁不是我的想法,但是......這是我現在的解決方案。如果你想出一個更好的,我會很高興聽到它:)

相關問題