作者giive (lala)
看板Ruby
标题Pagination Collection:进阶版的分页
时间Fri Nov 10 08:44:44 2006
http://lightyror.blogspot.com/2006/11/pagination-collection.html
关於 contagious 的文章让我获益良多
我会在我有空的时间继续研究 Pagination
当我第一眼看到 Pagination 时,我感觉到他是一个很好的东西 ,但是第二眼(大概十分钟後)就觉得这东西很『实用吗?』,虽然我很喜欢 Ruby on Rails ,但是我依然觉得预设的 Pagination 这个东西是一个基本版的功能。Let's face the music。
如果我们要加入一些关联性的资料库操作时,要怎麽分页?
是在後面加入 :conditions 的叙述吗?但是如果跨relation tables使用呢?当我开始质疑 Ruby on Rails 在分页实做不够的时候,Ruby 跳出来了。
根据 Wiki,请在任何 controller 可以 load 的地方加入这一行程式
def paginate_collection(collection, options = {})
default_options = {:per_page => 10, :page => 1}
options = default_options.merge options
pages = Paginator.new self, collection.size, options[:per_page], options[:page]
first = pages.current.offset
last = [first + options[:per_page], collection.size].min
slice = collection[first...last]
return [pages, slice]
end
然後,将你可以使用任何 Active Record 里面 Model 的函式,不管是预设的还是你自己写的,只要可以取出 Model Collection 的函式,都可以套入以下的方式
@分页Object , @object_list = paginate_collection (
随便一个Model.任何可以取出collection的函式,
:page => @params[:page] )
然後其他 View 的使用方式就跟原本的 Pagination 一模一样,完全没有变。这时候有人会问,什麽都可以套入 paginate_collection 吗?
是的。
假设 blogs 跟 comments 呈现 1 : m 的关系,而你想对特定一个 blog 的 model 底下的 comment 作分页,你可以使用
@pages , @comment_list = paginate_collection (
blog.comments, :page => @params[:page] )
这还不够,我有一个特别为某个 a Model 撰写的函式 find_hotest,这个函式会先去把某个 1:m 关系底下的所有 model object 取出来,然後每个 model object 都去找出另外一个相对应 n : m
的 Model 的数量取出来并且作 sort 。你看不懂我在讲什麽没关系,你只要知道这个在底层实做,这是一个我怎麽算都要 5个 SQL 做出来的函式,相当复杂。(不过我用 Active Record 1 行就写出来了,Active Record 真是太神奇了)当我想要为这个可怕的函式作分页,当然不可能使用 paginate :condition 来写,但是我们可以使用 paginate_collection
@pages , @a_list = paginate_collection (
a.find_hotest ,
:page => @params[:page] )
一样可以做到分页,而且 view 使用完全一模一样。只要能够套到 Active Record ,我想这个 paginate_collection 就应该趋近於无敌,可以陪伴我左右,替我东征西讨做完许多任务。
Beyond Java 里面 Justin Gehtland 说的一段话
==========================================
最近,Ruby 动态的特性真的为我带来许多好处。我的应用系统需要一些常用的功能,这些功能应该归属於框架层次。不需要深入原码,来加上这些新功能。我就只是在执行期动态的扩充我需要的类别。这种扩充性是许多静态型别语言所诅咒的(且不会这麽做的)
==========================================
我想,这个例子是这段话的最好的佐证。当我每次觉得 Ruby on Rails 缺乏那个功能时,Ruby 总是会跳出来说『这个交给Ruby 去作,可以很简单就做出来』。Ruby on Rails 将心力花在他所注重的事情上面,其他不足的东西,就交给 Ruby 去作吧。以前我觉得是『 Ruby on Rails 造就了 Ruby』,现在我觉得『Ruby on Rails 跟 Ruby 处於水帮鱼,鱼帮水的角色,谁都少不了谁』。
Ruby 很美,Rails 很神奇,但是少了其中一个,另外一个就不再闪闪发光。只有两者并行,才足以撼动世界。
--
lighty RoR 是一个介绍 lighttpd , SQLite , Ruby and Rails 的 Blog
http://lightyror.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.230.104.233