![](/img/trans.png)
[英]How do I disable a specific column in a table with jquery UI sortable?
[英]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.