Rails:对特定列进行排序

时间:2012-06-27 17:03:45

标签: ruby-on-rails sorting activerecord

我在视图上设计了一个表格,例如它们有两列IDname。我想当用户点击ID列时,数据将按ID排序,如果用户点击namedata将按name排序。< / p>

我的问题是:

有没有办法将其放入模型(数据库模型),因此,当用户单击一列时,其状态将被保存,数据库将查看此状态以根据此状态返回记录。

如果没有,我如何看待这段代码。

请帮帮我。

谢谢:)

1 个答案:

答案 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