在Rails应用程序中排序数据的最佳实践

时间:2009-10-18 19:11:23

标签: ruby-on-rails

在'index'方法中,我总是列出对象。为此处理排序的最佳做法是什么?所以在视图中我想要一个下拉菜单,让我选择[Created At,Size,Price,...]。一个例子将非常感激。

2 个答案:

答案 0 :(得分:0)

假设我有一个Book模型,我想获取一些按特定字段排序的书籍。为了快速完成这项工作,我将创建一个方法,比如fetch_books,它将采用options哈希值。此哈希将保存用户想要对返回的书籍列表进行排序的参数。

在您的模型中,您可以拥有,

class Book < ActiveRecord::Base
  def self.fetch_books(options)
    find(:all, :order => options[:sort_by])
  end
end

在你的控制器中,

class BooksController < ApplicationController
  @books = Book.fetch_books(params)
end

答案 1 :(得分:0)

我认为这更像是一个可用性最佳实践问题。

答案实际上取决于信息的显示方式。还有它有多少。

如果用户可以排序的所有信息都以表格形式显示在页面上,那么我将使用link_to_remote仅更新具有新排序的表。

如果您的列表足够长,可以按不同的标准排序,那么您可能会进行某种分页。所以这个例子使用了paginate。

控制器

def index
  order = params[:order] 
  find_options = {:per_page => params[:per_page] || 20,
     :page => params[:per_page] || 1),
     :order => order
  }

  @things = Things.paginate(find_options)
  respond_to do |format|
    format.html # default action
    # update only the table partial if action is a java script request.
    format.js render :update do |page|
      page.replace_html :things_table_body, :partial => things, :collection => @things
    end
  end
end

没有偏见就没有意义。

查看:

...
<table>
 <tr div="table_header">
   <th>
     <%= link_to_remote "Name",  things_url(:order => :name), :href => things_url(:order => :name)%>
   </th>
   <th>
     <%= link_to_remote "Created At",  things_url(:order => :name), :href => things_url(:order => :name)%>
   </th>
 </tr>
<tbody div="things_table_body">
<%= render :partial => :thing, :collection => @things} %>
</table>
<%= will_paginate @things %>
...

如果您的用户未启用JavaScript,则link_to_remote的href选项允许回退到html请求。

事情偏:

<tr>
  <td>
    <%=thing.name%>
  </td>
  <td>
    <%=thing.created_at%>
  </td>
</tr>

它留给读者练习如何在升序和降序排序之间切换。

如果您没有列出所有可排序的属性。选择框很好。我个人会选择单选按钮,如果排序方式列表不是太长。无论哪种方式,控制器代码看起来几乎与我之前发布的相同。