我在视图上设计了一个表格,例如它们有两列ID
和name
。我想当用户点击ID
列时,数据将按ID
排序,如果用户点击name
列data
将按name
排序。< / p>
我的问题是:
有没有办法将其放入模型(数据库模型),因此,当用户单击一列时,其状态将被保存,数据库将查看此状态以根据此状态返回记录。
如果没有,我如何看待这段代码。
请帮帮我。
谢谢:)
答案 0 :(得分:3)
看看这个railscast#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
如果有功能排序列,则需要将其保存到db
基本表:user_id,page_name(或table_name),sort_column,sort_direction
然后,当用户加载页面时,您将检查已保存的设置并加载它们(如果它们不存在),否则您可以加载默认设置。
这是我的想法,我没有时间为它编写代码,但它应该是相当直接的。
<强>更新强>
由于我必须在工作中这样做,我会发布我的代码。
上面的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
当我们现在搜索(路径 - &gt;'specific_controller #index?direction = asc&amp; 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 - &gt;我们排序什么列/哪个方向?)
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