论坛首页 编程语言技术论坛

山寨了一个配合acts_as_ferret使用的will_paginate分页

浏览 2190 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-10  
Rails项目中用上了Ferret分布,全文检索后,发现will_paginate的分页用不上了,于是google ,再配合实际情况,山寨了一个适合自己的版本。
参考了这篇文章:http://opensoul.org/2007/8/17/acts_as_ferret-will_paginate

model


#全文检索方法
  def self.full_text_search(q, options = {})  
    return nil if q.nil? or q==""  
    default_options = {:limit => 10, :page => 1}  
    options = default_options.merge options  
    
    # get the offset based on what page we're on  
    options[:offset] = options[:limit] * (options.delete(:page).to_i-1)  
    results = Page.find_by_contents(q, options)     
  end


戏肉来了,在application.rb写了一个公用的分页
#全文检索分页方法
  def pages_for(result,options = {})  
    page, per_page, total = (options[:page] || 1),(options[:per_page] || 30),(result.total_hits || 0)
    page_total = page * per_page
    index = (page.to_i - 1) * per_page
    pager = WillPaginate::Collection.new(page, per_page, page_total)
    returning WillPaginate::Collection.new(page, per_page, total) do |pager|
      pager.replace result[index,per_page]
    end
  end


在controller中如下使用
results = Page.full_text_search @q
@pages = pages_for(results,:page => 1)


当然山寨的东西,质量不敢保证,不过不用担心,会有售后服务的,只是先写下这个思路和初步的实现(怕忘记了),以后继续使用,会慢慢地完善。
   发表时间:2008-10-10  
    pager = WillPaginate::Collection.new(page, per_page, page_total)  
    returning WillPaginate::Collection.new(page, per_page, total) do |pager|


请问第一个pager是不是会被block的给覆盖,起不了作用?
0 请登录后投票
   发表时间:2008-10-10  
pager在这里只是一个定义了page_total数量的数组(每个对象都是nil),
后面是block是会把真实的数据项替换掉nil,所以就有了will_paginate列表了.
0 请登录后投票
   发表时间:2008-10-10  
第6行 pager = WillPaginate::Collection.new(page, per_page, page_total)  是不必要的代码,可以省略
0 请登录后投票
   发表时间:2008-10-10  
Quake Wang此言不差,我开始没搞清楚ruturning的用法
看到一个帖子 http://9esuluciano.iteye.com/blog/123917 如是说:ruturning 实际上就是把一个value放到一个block中做处理,处理完毕之后返回,就这么简单
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics