3

让我先说我是 Rails 新手,所以我将尽力解释这一点。作为参考,请参阅此线程,该线程准确描述了发生在我身上的事情,但修复似乎不起作用。

Rails 3.2 中的限制方法和哈希排序问题

我有一个数据库,其中包含我试图按主键“id”排序的事件。我尝试在此处对可排序表列进行 Railscast 操作:

http://railscasts.com/episodes/228-sortable-table-columns

排序工作正常,但排序发生在整个列上,而不仅仅是“最后 50 个”。

控制器代码:

def index
  @events = Event.order(sort_column + " " + sort_direction).page(params[:page]).last(50)
  @events = @events.sort_by(&:id)
  @events = Kaminari.paginate_array(@events).page(params[:page]).per(10)
end

def sort_column
  Event.column_names.include?(params[:sort]) ? params[:sort] : "event_id"
end

def sort_direction
  %w[asc desc].include?(params[:direction]) ? params[:direction] : "desc"
end

应用程序助手:

    def sortable(column, title = nil)
  title ||= column.titleize
  direction = column == sort_column && sort_direction == "desc" ? "asc" : "desc"
  link_to title, :sort => sort_column, :direction => direction
end

最后,在索引视图中,我这样称呼它:

<th><%= sortable  "event_id" %></th>

很抱歉,如果这个问题已经得到解答,任何关于这个主题的帮助将不胜感激。

编辑

感谢您的快速回复。我明白你在那里做了什么,但现在我在我的索引视图中由于某种原因得到了一个例外。

 undefined method `id' for #<Array:0x00000004170c10>

Extracted source (around line #25):

22:   <tbody>
23:     <% @events.each do |event| %>
24:       <tr>
25:         <td><%= link_to event.id, event_path(event) %></td>
26:         <td><%= event.event_date_time_local %></td>
27:         <td><%= EventType.find(id =    event.event_type_id).event_type %></td>
28:         <td>
4

1 回答 1

0

您说的是“而不是最后 50 个”,但这就是您要返回的全部内容。根据 sort_column 和方向排序后找到的最后 50 个项目。

@events = Event.order(sort_column + " " + sort_direction).page(params[:page]).last(50)
#Sorted the last 50 by sort_column and direction

@events = @events.sort_by(&:id)
#sorted again by id and lost the first sort

要获取所有事件,然后对最后五十个进行排序,您可以这样做

@events = Event.order(sort_column + " " + sort_direction).page(params[:page])
last_fifty = @events.pop(50) # remove last 50 and return it

@events << last_fifty.sort_by(&:id) # insert last fifty back sorted by id

编辑:

对不起,而不是

@events << last_fifty.sort_by(&:id)

尝试

@events.concat last_fifty.sort_by(&:id)
于 2012-09-27T18:05:02.063 回答