javascript - 如何配置数据表,以便它根据创建的日期对记录进行排序(描述)?

标签 javascript ruby-on-rails sorting date datatable

我正在我的rails应用程序中使用datatable到用户index页面。我的 index 页面中的第一created_at。此中的数据看起来像Mon, 17-Oct-2016。我想让此列应根据 desc order 中的日期格式进行排序。我怎样才能做到这一点? 这就是我尝试过的。但没有成功。

<script type="text/javascript">
  $(document).ready(function() {
    var index = $('#reg_req_data_table').dataTable({
      "order": [[ 1, "desc" ]],
       'aoColumnDefs': [{
       'bSortable': false      
    }],
    "bLengthChange": false,
    "sDom": '<"top"pfl>rt<"bottom"i><"clear">'
      });
  });
</script>

最佳答案

这个答案将向您展示如何遵循 Rails 约定并在 ruby​​ 类中处理排序,然后再以 json 形式返回到 DataTables。另外,如果您要处理超过数百条记录,强烈建议您使用服务器端处理,这比客户端处理要快得多(此示例将显示服务器端):

您的 user#index 操作应该是:

def index
  respond_to do |format|
    format.html
    format.json { render json: UsersDatatable.new(view_context) }
  end
end

您应该在应用程序文件夹中创建一个名为 datatables 的子文件夹,然后向其中添加以下 .rb 文件:

#app/datatables/users_datatable.rb   Notice it's called users_datatable! Rails will infer the proper class lookup path because of this.
class UsersDatatable
  delegate :params, :h, :link_to, to: :@view

  def initialize(view)
    @view = view
  end

  def as_json(options = {})
    {
      sEcho: params[:sEcho].to_i,
      iTotalRecords: User.count,
      iTotalDisplayRecords: users.total_entries,
      aaData: data
    }
  end

private

  def data
    users.map do |user|
      [
        user.created_at.strftime("%d-%b-%y")
      ]
    end
  end

  def users
    @users ||= fetch_users
  end

  def fetch_users
    users = User.all.order("created_at DESC")
    users = users.page(page).per_page(per_page)
    if params[:search].present? && params[:search]["value"].present?
      users = users.where("email like :search", search: "#{params[:search]["value"]}%")
    users
  end

  def page
    params[:start].to_i/per_page + 1
  end

  def per_page
    params[:length].to_i > 0 ? params[:length].to_i : 10
  end

  def sort_column
    columns = %w[created_at ]
    columns[params[:order]["0"]["column"].to_i]
  end

  def sort_direction
    params[:order]["0"]["dir"] == "desc" ? "desc" : "asc"
  end
end

现在您相应的用户 View index.html.erb应该是:

<div class='table-responsive'>
  <table id='reg_req_data_table' data-source="<%= users_path(params.merge!(format: :json).deep_symbolize_keys)%>">
  <thead>
    <tr>
       <th>Created On:</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>
</div>

<script type="text/javascript">
  $(document).ready(function() {
    $('#reg_req_data_table').DataTable({
       "serverSide": true,
       "ajax": {url: '<%= users_path(params.merge!(format: :json).deep_symbolize_keys)%>', type: "POST"},
       "processing": true
    }),
  });
</script>

请注意表体标签中没有任何内容。服务器端处理设置数据表通过 json 接受该信息,这是我们在 UsersDatatable 类中发送的内容。

关于javascript - 如何配置数据表,以便它根据创建的日期对记录进行排序(描述)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40083613/

相关文章:

java - 关于基数排序的 Java 实现的解释

javascript - 带有预先输入的 Angular 自动完成功能

javascript - `base` 标记导致 iframe 在 Internet Explorer 中作为新窗口打开

ruby-on-rails - 如果某些子类缺少模板,rails 会重定向到父类(super class)的模板

ruby-on-rails - 使用 RSpec stub ActiveRecord 动态查找器

ruby-on-rails - ActiveSupport::JSON.decode 无法正确处理文字换行符

JavaScript 停止事件流

Javascript 验证允许多个文件上传的字段。检查是否已做出选择?

python - 使用 python 字典进行排序

java - 给定第一个元素的权重限制,获得对的第二个元素的最大总和