我在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
您是否看到最後一條中沒有包含條件?這是造成這個問題的原因。
我錯過了什麼?我的理解是:條件行爲就像一個SQL WHERE語句,所以技術上你首先用標準語法過濾條件... – ghoppe 2010-06-15 00:38:27
是的,但在這種情況下它不起作用... – 2010-06-15 01:17:44
我編輯了我的答案...希望它可以幫助你:] – 2010-06-15 02:17:50