Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby/Active Record:自定义排序顺序_Ruby_Ruby On Rails 3 - Fatal编程技术网

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

Ruby/Active Record:自定义排序顺序,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我正在从事Rails3.2Ruby1.9.2项目 我从数据库中获得了一些经典值: designators = Model.find() 我用(简化代码)在视图中显示它: 例如,值为:3L、3C、3R。(L表示左侧,C表示中间,4表示右侧)。 我想订购值,如:3L,3C,3R,而不是3C,3L,3R 我不知道如何定义这个定制订单。有什么想法吗?你可以这样做。这不是一个完整的答案,但这种方法可能会有所帮助 arr = ["3R", "3C", "2C", "4C", "2L", "2R", "

我正在从事Rails3.2Ruby1.9.2项目

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

designators = Model.find()
我用(简化代码)在视图中显示它:


例如,值为:3L、3C、3R。(L表示左侧,C表示中间,4表示右侧)。 我想订购值,如:3L,3C,3R,而不是3C,3L,3R


我不知道如何定义这个定制订单。有什么想法吗?

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

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]
,尝试以下操作:

(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
注意:这是内存中的排序,因此根据您对该对象的排序/访问方式,注意O(n)db查询


另请参见:有关使用类似模块(可能是更清洁的解决方案)

什么是
3
?你能显示视图代码吗?你的方法很有帮助。我编辑了我的答案以便更清楚。您的解决方案适用于ruby阵列。就我而言,这是一个活跃的唱片协会。谢谢你。这就是我要找的。就我个人而言,你来自哪里?你有多少RoR经验?
(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)