1

ビューのテーブルを設計しています。たとえば、 と の 2 つの列がIDありnameます。ユーザーが列をクリックするとID、データがソートされIDます。同様に、ユーザーがクリックした場合、name, the dataは でソートされnameます。

私の質問は:

これをモデル (データベース モデル) に入れる方法はありますか? ユーザーが 1 つの列をクリックすると、そのステータスが保存され、データベースはこれを見て、このステータスに従ってレコードを返します。

そうでない場合は、このコードをどのように表示するか。

私を助けてください。

ありがとう :)

4

1 に答える 1

3

このrailscasts#228http://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は、列での並べ替えを可能にする次の3つの関数を実装しています。

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

今すぐ検索する場合(path->'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->どの列をソートしていますか/どの方向ですか?)

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 に答える