2012-06-27 39 views
1

我正在設計一個視圖表,例如他們有兩列是IDname。我想當用戶點擊到ID列時,數據將按ID排序,如果用戶點擊namedata將按name排序。Rails:爲特定列排序

我的問題是:

有什麼辦法把這個分爲模型(數據庫模型),因此,當用戶單擊一個列,它的地位將被保存,數據庫將搜索這根據返回記錄這種狀態。

如果沒有,我如何把這段代碼放在視圖中。

請幫幫我。

謝謝:)

回答

3

看這個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