3

私はRailsの初心者であると言うことから始めましょう。それで、これをできる限り説明しようと思います。参考までに、修正が機能していないように見えることを除いて、私に何が起こっているのかを正確に説明しているこのスレッドを参照してください。

Rails3.2のlimitメソッドとハッシュ順序に関する問題

主キー「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

Application_helper:

    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とdirectionに基づいて並べ替えた後、最後に見つかった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

すべてのイベントを取得してから、最後の50を並べ替えるには

@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 に答える