我正在設計一個視圖表,例如他們有兩列是ID
和name
。我想當用戶點擊到ID
列時,數據將按ID
排序,如果用戶點擊name
列data
將按name
排序。Rails:爲特定列排序
我的問題是:
有什麼辦法把這個分爲模型(數據庫模型),因此,當用戶單擊一個列,它的地位將被保存,數據庫將搜索這根據返回記錄這種狀態。
如果沒有,我如何把這段代碼放在視圖中。
請幫幫我。
謝謝:)
我正在設計一個視圖表,例如他們有兩列是ID
和name
。我想當用戶點擊到ID
列時,數據將按ID
排序,如果用戶點擊name
列data
將按name
排序。Rails:爲特定列排序
我的問題是:
有什麼辦法把這個分爲模型(數據庫模型),因此,當用戶單擊一個列,它的地位將被保存,數據庫將搜索這根據返回記錄這種狀態。
如果沒有,我如何把這段代碼放在視圖中。
請幫幫我。
謝謝:)
看這個railscasts#228 http://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
然後,當用戶加載一個頁面,你會檢查保存的s如果它們存在,則加載它們,如果它們不是,則可以加載默認值。
這是我的想法,我沒有時間爲它編寫代碼,但它應該相當簡單。
更新:
因爲我不得不在工作中要做到這一點,我會後我的代碼。
上面的railscast實現了以下三個函數,它們允許在列上進行排序。
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
爲優先表遷移當我們現在搜索(路徑 - >「specific_controller#指數方向= ASC &排序=名字?」),我們需要保存/更新用戶的偏好
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