如何添加按选项排序?

时间:2014-02-21 17:24:23

标签: ruby-on-rails ruby ruby-on-rails-4

我在事件页面上有一个'Sort By'下拉列表,用户可以在其中查看多个事件,并且我想允许用户按名称(Alphebetical),Date(Created_At)和可能(Number)对事件进行排序参加高/低的人。

我怎样才能做到这一点?我猜测默认范围:order,Event.where(:name,ASC)例如但我不确定,因为我之前从未这样做过。另外我如何在下拉列表中显示/使用范围?

3 个答案:

答案 0 :(得分:2)

我推荐你非常有用的宝石has_scope: https://github.com/plataformatec/has_scope

你可以用它做什么:

class Event < ActiveRecord::Base
  scope ordered, lambda do |attribute, order|
    return where("FALSE") unless self.attribute_names.include?(attribute.to_s)
    order(attribute.to_sym, order.to_sym
  end


class EventsController < ApplicationController
  has_scope :ordered do |controller, scope, value|
    scope.ordered(value, :desc)
  end

# view
options = [['Name', 'name'], ['Date', 'date']]
select_tag("ordered", options_for_select(options, selected: params[:ordered]), onchange: "window.location.href = window.location.origin + window.location.pathname + '?ordered=' + $(this).val();"

我没有测试视图,你可能需要稍微更改一下代码。 javascript重定向不支持额外的GET参数!

答案 1 :(得分:0)

看看RailsCasts

http://railscasts.com/episodes/240-search-sort-paginate-with-ajax

这还包括pagination和简单搜索。但是,您可以从中获取您正在寻找的部分。

答案 2 :(得分:0)

对于活动记录,您只需将.order(符号)附加到活动记录查询。

你可以做的字母。

Object.where(ARRGUMENT).order(:name)

或所有

Object.order(:name)

你不需要使用一个范围来解决这个问题。

如果要创建交互式表,则可能需要考虑使用Javascript解决方案。这是对我来说最好的一个。

https://datatables.net/

我已经使用并且目前使用这个宝石取得了巨大的成功。

https://github.com/rweng/jquery-datatables-rails