Ruby / Active Record:自定义排序顺序

时间:2014-08-25 10:45:47

标签: ruby ruby-on-rails-3

我正在使用rails 3.2 ruby​​ 1.9.2项目。

我从经典数据库中获取了一些值:

designators = Model.find()

我用(简化代码)显示它:

<table class="rwy_modes_table" cellspacing='0'>
  <% designators.each do |info_design| %>
    <tr id="rwy_mode_<%=info_design.id%>">
      <td class="spacer"><%= info_design.try(:designator) %></td>
    </tr>
  <% end %>
</table>

值例如是:3L,3C,3R。 (左为L,中心为C,右为4)。 我想要的值如下:3L,3C,3R而不是3C,3L,3R

我不知道如何定义此自定义订单。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

尝试这样的事情:

(app/models/designator.rb)
# determines the sort value for based on my_attribute.
# designators should be in the order 'l', 'c', 'r' - regardless of any preceeding numeral
def sort_val
  return 0 if self.my_attribute =~ /l/i
  return 1 if self.my_attribute =~ /c/i
  return 2 if self.my_attribute =~ /r/i
end

(app/helpers/designators_helper.rb)
def sorted_designators(designators)
  designators.sort{|a, b| a.sort_val <=> b.sort_val }
end

您可以在视图中进行排序

(app/views/...)
sorted_designators(designators).each do |design|

或者,您可以将其移动到模型文件中的静态方法,以便在视图外轻松排序

(app/models/designator.rb)
def self.sorted_designators(designators)
  designators.sort{|a, b| a.sort_val <=> b.sort_val }
end

并在你的控制器中使用它们

app/controllers...
@designators = Designator.sorted_designators(designators)

注意:这是内存中的排序,因此请根据排序/访问此对象的方式监视O(n)db查询

另请参阅:https://stackoverflow.com/a/14282353/811255使用Comparable模块(可能是更清洁的解决方案)

答案 1 :(得分:3)

你可以这样做。这不是一个完整的答案,但这种方法可能有所帮助。

arr = ["3R", "3C", "2C", "4C", "2L", "2R", "3L", "4R", "4L"] # Array to be sorted

tmp_arr = ['L', 'C', 'R']

arr.sort_by {|s| [s[0], tmp_arr.index(s[1])] }
# => ["2L", "2C", "2R", "3L", "3C", "3R", "4L", "4C", "4R"]

这假设"2R""3L"之前,如果您想在排序时忽略数字,可以从代码块中删除s[0]