Glyphicon Arrow帮助对列进行排序

时间:2016-04-03 02:21:49

标签: ruby-on-rails ruby sorting

我有一个显示几个不同数据属性的表,我按照railscast#228使列可以排序。除了一个名为&#34; groups&#34;当我点击该链接时,我的方向箭头会中断并恢复到原始标题(为了清楚起见,我会发布截图)。我有一个帮助器,一个控制器和一个呈现问题代码功能的视图,我现在将显示相应的代码,并尽力描述您需要知道的所有内容以帮助我。这是我的看法。您可以在@people块中看到<td><%= person.groups.order(:id).pluck(:name).to_sentence %></td>是问题所在。

<table class="table table-striped">
<thead>
  <tr>
    <th><%= sortable 'phone_number', 'Phone Number'%></th>
    <th><%= sortable 'subscribed', 'Subscribed'%></th>
    <th><%= sortable 'city' %></th>
    <th><%= sortable 'state' %></th>
    <th><%= sortable 'zip' %></th>
    <th><%= sortable 'country' %></th>
    <th><%= sortable 'groups' %></th>
    <th><%= sortable 'created_at', "Joined" %></th>
  </tr>
  </thead>

<% @people.each do |person| %>
      <tr>
        <td><%= person.phone_number %></td>
        <td><%= person.subscribed? ? "Yes" : "No" %></td>
        <td><%= person.city %></td>
        <td><%= person.state %></td>
        <td><%= person.zip %></td>
        <td><%= person.country %></td>
        <td><%= person.groups.order(:id).pluck(:name).to_sentence %></td>
        <td><%= time_ago_in_words person.created_at %> ago</td>
        </tr>
       <% end %>

这是可排序的辅助方法

 def sortable(column, title = nil)
title ||= column.titleize
if column != sort_column
  css_class = nil
  direction = "asc"
elsif sort_direction == "asc"
  css_class = "glyphicon glyphicon-triangle-top"
  direction = "desc"
else
  css_class = "glyphicon glyphicon-triangle-bottom"
  direction = "asc"
end
link_to "#{title} <span class='#{css_class}'></span>".html_safe, sort: column, direction: direction
end 

这是我的控制器

  def index
@people = Person.order(sort_column => sort_direction)
@groups = Group.all
end

这些是私人

中的排序方法
  def sort_column
  Person.column_names.include?(params[:sort]) ? params[:sort] : "phone_number"
  end

  def sort_direction
%w(asc desc).include?(params[:direction]) ? params[:direction] : "asc"
  end

这是一个截图,这是点击&#34; Groups&#34;的结果。头。你可以看到它恢复到电话号码。 *注意 - 每个其他标题排序并正确显示排序箭头。

enter image description here

1 个答案:

答案 0 :(得分:2)

问题的根本原因不在于您在问题中提供的代码中,而是在截屏视频中的代码示例中。有这种方法,我假设您实现了类似的方法:

def sort_column
  Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
end

请注意,表中的groups不是数据库列的名称,而是与其他模型的关联名称。因此,此方法将始终返回"name"(或我假设您的方法中为"phone_number"。)

您不能以与列相同的方式在活动记录中订购关联。可能有解决方法的方法,但这取决于您对groups关联排序的定义:您是否要按组名称对“组”列中的条目进行排序,数量为团体或团体ID?

如果要按关联实现排序,则需要执行两项操作。除了列名之外,首先允许sort_column方法接受关联名称:

def sort_column
  sortables = Person.column_names + ['groups']
  sortables.include?(params[:sort]) ? params[:sort] : 'phone_number'
end

作为第二步,您可以在某处处理关联排序的特殊情况,可能在模型中的scope中:

# in the model:
scope :sort_by, lambda { |options|
  if options.key == ['groups']
    scope = select('DISTINCT people.*').joins(:groups)
    if options.values == ['asc'] 
      scope.order('MIN(groups.name)') 
    else 
      scope.order('MAX(groups.name)')
    end
  else
    order(options)
  end
}

# in the controller
@people = Person.sort_by(sort_column => sort_direction)

免责声明:我不确定范围是否真的像您期望排序一样有效。也许它会马上引发错误。如果没有实际运行数据库的可能性就很难编写这样的代码。但是你明白了:当你想按关联而不是列进行排序时,它会变得混乱,因为这与你看过的截屏视频无关......