我想按日期降序对我的列表进行排序,作为“新用户列表”,在数据库中我有一列是
t.datetime "created_at", null: false
这是新用户注册的时间,在视图中,我有这样的代码:
%table.table.table-striped.table-hover
%thead
%h3 New Users
%hr
%th Name
%th Company
%th Role
%th Created date
%th{:width => '50'}
%th{:width => '50'}
%th{:width => '50'}
%tbody
- @users.each do |user|
-if user.role == "trial-member"
- @created_at.sort{|a,b| b.created_at <=> a.created_at}.each do |created_at|
%tr
%td
= user.first_name
= user.last_name
%td= user.company
%td= user.role
%td= user.created_at
%td= link_to 'Approve', edit_user_path(user), {:class => 'btn btn-success btn-sm'}
但这给出了一个错误“undefined method `sort' for nil:NilClass”,我该怎么做才能按创建日期对表中的列表进行降序排序?谢谢。
在您的控制器中:
@users = User.order('created_at DESC')
只需在您要获取
order('created_at DESC')
的逻辑中添加:@users
。
在你看来,你现在可以摆脱
- @created_at.sort{|a,b| b.created_at <=> a.created_at}.each
:
%h3 New Users
%table.table.table-striped.table-hover
%thead
%tr
%th Name
%th Company
%th Role
%th Created date
%th{:width => '50'}
%th{:width => '50'}
%th{:width => '50'}
%tbody
- @users.each do |user|
-if user.role == "trial-member"
%tr
%td
= user.first_name
= user.last_name
%td= user.company
%td= user.role
%td= user.created_at
%td= link_to 'Approve', edit_user_path(user), {:class => 'btn btn-success btn-sm'}
您看到的错误是因为
@created_at
不是可枚举对象,因此它不会响应 sort
。
这是因为
@created_at
没有在任何地方定义。因此,任何未定义的实例变量默认返回 nil。如果你想按排序顺序显示用户,那么你需要按顺序获取@users
。
@users = User.order(created_at: :desc)
我不知道你在哪里创建变量@create_at。 但如果你需要对用户进行排序,你可以尝试这种方式:
%table.table.table-striped.table-hover
%thead
%h3 New Users
%hr
%th Name
%th Company
%th Role
%th Created date
%th{:width => '50'}
%th{:width => '50'}
%th{:width => '50'}
%tbody
- @default_create_at = Time.now
- @users.sort_by { |u| u.created_at ? u.created_at : @default_create_at }.each do |user|
-if user.role == "trial-member"
%tr
%td
= user.first_name
= user.last_name
%td= user.company
%td= user.role
%td= user.created_at ? user.created_at : @default_create_at
%td= link_to 'Approve', edit_user_path(user), {:class => 'btn btn-success btn-sm'}