1

我正在设计一个视图表。例如,它们有两列是IDname。当用户单击该ID列时,我希望数据将按ID. 同样,如果用户点击name, the data将按name.

我的问题是:

有什么办法可以把它放入模型(数据库模型)中,因此,当用户单击一列时,它的状态将被保存,数据库将查看它并根据此状态返回记录。

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

请帮我。

谢谢 :)

4

1 回答 1

3

看看这个 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
于 2012-06-27T17:10:05.173 回答