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

我正在研究rails 3.2 ruby​​ 1.9.2项目。

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

designators = Model.find() 

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

   <tr id="rwy_mode_"> 

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

我不知道如何定义这个自定义订单。 任何的想法 ?

尝试这样的事情:

 (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模块(可能是更清洁的解决方案)

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

 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]