您好我想在Rails控制器中对数组进行排序。我想在我在视图中循环它之前对数组进行排序
@projects = Project.all.sort #throws error
#and
@projects = Project.all
@projects.sort # throws error
抛出此错误:<=>
的未定义方法#<Project:0x101f70b28>
但是当我查询:
@projects.respond_to?('sort')
我明白了
如何对数组进行排序?应该在视图中还是在控制器中完成? 任何帮助都非常感谢!
答案 0 :(得分:15)
Ruby不知道如何对项目进行排序。您必须指定要用于排序的字段。 created_at
的示例:
@projects = Project.all.sort { |p1, p2| p1.created_at <=> p2.created_at }
或
@projects = Project.all.sort_by &:created_at
或者,您可以在数据库级别对它们进行排序:
@projects = Project.find(:all, :order => 'created_at')
答案 1 :(得分:4)
当您尝试对对象数组进行排序时,ruby需要知道如何确定哪些对象首先出现。
如果您的对象具有内在顺序,例如他们有一个“数字”要排序,然后在你的项目中实现一个方法,如下所示:
def <=> other
number <=> other.number
end
&lt; =&gt; ruby使用方法比较两个对象并确定首先出现的对象。在这个例子中,我们只是将排序委托给number属性(字符串和数字都已经内置了)
如果可能有很多方法对对象进行排序,另一种方法是在排序时指定如何排序。正如True Soft所解释的,有几种方法可以做到这一点,我最喜欢的是
@projects = Project.all.sort_by &:created_at
..按created_at字段排序
答案 2 :(得分:0)
最简单的方法是覆盖&lt; =&gt;在项目中:
def <=>(other_project)
self.some_comparable_field <=> other_project.some_comparable_field
# or otherwise return 1, 0 or -1 based on custom comparison rule
end
然后你的原始代码就可以了。