簡體   English   中英

使用Rails 3,Ruby 1.9.2,如何使表在不是DB列的列上可排序?

[英]With Rails 3, Ruby 1.9.2, how do I make a table sortable on a column that is NOT a DB column?

遵循以下railscast http://railscasts.com/episodes/240-search-sort-paginate-with-ajax可以輕松創建一個表,該表可以根據數據庫中存在的列進行排序。 但是我在表中顯示的其他列不是數據庫列,但仍需要按這些列進行排序。

例如,我有多列組成供體名稱(前綴1,first_name1,middle_name1,last_name1,后綴1,前綴2,first_name2,middle_name2,last_name2,suffix2,company)。 我在模型“ who_donated”中定義了它,它是使用給出的一些規則將實際的表列組合在一起的。 因此,基本上,我顯示的捐助者表中有1個用於who_donated的字段,我希望能夠對該字段進行排序。

如果該列不是數據庫表中的實際列,如何對它進行排序?

因為我有很多不同的收集信息的方式來放入需要排序的列中,並且由於可能有許多100ks的行可以排序,所以我決定將盡可能多的工作放在mysql服務器上,以便對每種情況進行分類。

這就是我的解決方法...我幾乎遵循railscasts 228和240進行初始設置:http://asciicasts.com/episodes/228-sortable-table-columns和http://asciicasts.com/episodes/ 240用ajax搜索排序分頁

然后,我做了如下修改。

捐助者控制者:

def last_sort_column
  params[:sort].blank? ? 'created_at' :  params[:sort]
end 

def sort_column
  case 
    when Donor.column_names.include?(params[:sort]) then params[:sort]
    when params[:sort] == 'Donors' then 
        'concat(prefix1,first_name1,middle_name1,last_name1,suffix1,
        prefix2,first_name2,middle_name2,last_name2,suffix2,company)' 
    when params[:sort] == 'First Donated' then
         '(select min(donations.created_at) from donations where donations.donor_id = donors.id)'       
    when params[:sort] == 'Last Donated' then
         '(select max(donations.created_at) from donations where donations.donor_id = donors.id)'       
    when params[:sort] == 'Times Donated' then
         '(select count(*) from donations where donations.donor_id = donors.id)'       
    when params[:sort] == 'Total Amount' then
         '(select sum(amount) from donations where donations.donor_id = donors.id)'       
    else 'created_at'
  end
end

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

和application_helper:

def sortable(column, title = nil)
  title ||= column.titleize
  css_class = (column == last_sort_column) ? "current #{sort_direction}" : nil
  direction = (column == last_sort_column && sort_direction == "asc") ? "desc" : "asc"
  link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}
end

last_sort_column的添加是因為按語句發送到order的sort_column與列名不匹配,因此它永遠不會記住您按asc或desc排序的內容。

這使我可以按照自己的意願對sql語句進行瘋狂處理,但是由於url僅顯示列的實際名稱,因此仍然完全避免了sql注入的任何可能性。 如果輸入了除我允許的有效選項以外的其他值,則默認為created_at並丟棄假值。

實際上,令我驚訝的是,它對鏈接到另外20萬行的10萬行進行排序的速度有多快。

最簡單的情況:

<% sorted_donors = @unsorted_donors.sort_by{ |donor| donor.who_donated } %>

在此處閱讀有關sort_by的更多信息: http ://www.ruby-doc.org/core-1.9.2/Enumerable.html#method-i-sort_by

就像我說的那樣,將代碼直接放入視圖是獲得所需排序的最丑陋但最簡單的方法。 如果要進行分頁,則需要在進行分頁之前在控制器中進行排序等。但是,此代碼段至少應使您朝正確的方向前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM