2016-04-03 105 views
0

我有一个表格显示一些不同的数据属性,我遵循railscast#228使列可排序。几乎所有的工作除了一个名为“groups”的标题,当我点击链接我的方向箭头中断,它回复到原始标题(为了清楚起见,我会发布截图)。我有一个助手,一个控制器和一个呈现问题代码功能的视图,现在我将显示相应的代码,并尽我所能来描述为了帮助我而需要知道的一切。这是我的观点。您可以在@people块中看到<td><%= person.groups.order(:id).pluck(:name).to_sentence %></td>是问题所在。Glyphicon箭头帮助排序列

<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 

这里是截图的排序方法,这是结果点击“群组”标题。正如你所看到的,它会回复到电话号码。 *注 - 每个其他标题都会正确排序并显示排序箭头。

enter image description here

回答

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) 

声明:我不确定范围实际上是否工作正常,就像您期望排序工作一样。也许它会马上提出一个错误。只是很难编写这样的代码,而没有实际运行数据库的可能性。但你有这样的想法:当你想通过关联而不是列来排序时,它会变得混乱,因为这与你看过的截屏无关......

+0

是的,我想按组名排序 – Bitwise

+0

@ CameronBass如何在该列中有多个组时按组名称排序?如果有一个带有“访客”的专栏,一个带有“访客,员工”和一个带有“志愿者,跳舞”的专栏 - 您喜欢的订单是什么,为什么? – spickermann

+0

我只是按字母顺序思考,就好像只有'员工'中有一个人,而'志愿者'中有一个人,用户可以按这种方式排序。诚然,它不会很有用,但它会保持整个页面的连续性。 – Bitwise