我正在设计一个视图表。例如,它们有两列是ID
和name
。当用户单击该ID
列时,我希望数据将按ID
. 同样,如果用户点击name
列, the data
将按name
.
我的问题是:
有什么办法可以把它放入模型(数据库模型)中,因此,当用户单击一列时,它的状态将被保存,数据库将查看它并根据此状态返回记录。
如果没有,我如何看待这段代码。
请帮我。
谢谢 :)
我正在设计一个视图表。例如,它们有两列是ID
和name
。当用户单击该ID
列时,我希望数据将按ID
. 同样,如果用户点击name
列, the data
将按name
.
我的问题是:
有什么办法可以把它放入模型(数据库模型)中,因此,当用户单击一列时,它的状态将被保存,数据库将查看它并根据此状态返回记录。
如果没有,我如何看待这段代码。
请帮我。
谢谢 :)
看看这个 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
然后,当用户加载页面时,您将检查保存的设置并加载它们(如果存在),如果它们不存在,则可以加载默认值。
这就是想法,我没有时间为它编写代码,但它应该相当直截了当。
更新:
由于我必须在工作中执行此操作,因此我将发布我的代码。
上面的 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#index?direction=asc&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 -> What column are we sort/which 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