このrailscasts#228http://railscasts.com/episodes/228-sortable-table-columnsを見てください
def sortable(column, title = nil)
title ||= column.titleize
css_class = column == sort_column ? "current #{sort_direction}" : nil
direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
link_to title, {:sort => column, :direction => direction}, {:class => css_class}
end
機能的な並べ替え列がある場合は、それをデータベースに保存する必要があります
次の基本テーブル:user_id、page_name(またはtable_name)、sort_column、sort_direction
次に、ユーザーがページをロードするときに、保存されている設定と照合し、存在する場合はロードします。存在しない場合は、デフォルトをロードできます。
これはアイデアです。コードを書く時間はありませんが、かなり簡単なはずです。
アップデート:
仕事でこれをしなければならなかったので、コードを投稿します。
上記のrailscastは、列での並べ替えを可能にする次の3つの関数を実装しています。
application_controller.rb/またはspecific_controller.rb
def sort_column
Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
end
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
end
そしてそれを使用するコントローラー
def index
@products = Product.order(sort_column + " " + sort_direction)
end
ここで、ユーザーが並べ替えに選択したものを記憶し、それを使用するために、常にデフォルトの並べ替え可能な列をロードする代わりに、user_preferences
次のような設定テーブルの移行を作成します
create_table :user_preferences do |t|
t.string :action
t.string :preference
t.references :user
end
add_index :user_preferences, :user_id
今すぐ検索する場合(path->'specific_controller#index?direction = asc&sort = name')、ユーザーの設定を保存/更新する必要があります
def index
preference = UserPreference.find_by_user_id_and_action(User.current_user.id, params[:action])
#Save/update preference based on column sort
if params[:sort]
unless preference.nil?
preference.update_attribute(:preference, "#{params[:sort]},#{params[:direction]}")
else
preference = UserPreference.new(:user => User.current_user, :preference => "#{params[:sort]},#{params[:direction]}", :action => params[:action])
end
end
populate_table_based_on_preference(preference)
end
def populate_table_based_on_preference(preference)
unless preference.nil?
@products = Product.order(preference.preference.split(',')[0]+ " " + preference.preference.split(',')[1])
else
@products = Product.order(sort_column + " " + sort_direction)
end
end
次に、メソッドを更新する必要があります(sort_column / direction->どの列をソートしていますか/どの方向ですか?)
def sort_column
#What are we sorting on?
preference = UserPreference.find_by_user_id_and_action(User.current_user.id, params[:action])
unless preference.nil?
preference.preference.split(',')[0]
else
Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
end
end
def sort_direction
preference = UserPreference.find_by_user_id_and_action(User.current_user.id, params[:action])
#what is the search direction
unless preference.nil?
preference.preference.split(',')[1]
else
%w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
end
end