Ruby on rails 具有特定数据的排序模型

Ruby on rails 具有特定数据的排序模型,ruby-on-rails,ruby,sorting,Ruby On Rails,Ruby,Sorting,我想根据特定的顺序对我的模型数据进行排序 Model: Grade Table Column: category, value values of category: Prelim, Midterm, Semi-finals, Finals 如何根据“预备赛、期中赛、半决赛、决赛”的类别对成绩表进行排序?您应该将其替换为一个数字: 1 = Prelim 2 = Midterm 3 = Semi-finals 4 = Finals 然后在模型中对它们进行如下排序: class Grade .

我想根据特定的顺序对我的模型数据进行排序

Model: Grade
Table Column: category, value
values of category: Prelim, Midterm, Semi-finals, Finals

如何根据“预备赛、期中赛、半决赛、决赛”的类别对成绩表进行排序?

您应该将其替换为一个数字:

1 = Prelim 
2 = Midterm
3 = Semi-finals
4 = Finals
然后在模型中对它们进行如下排序:

class Grade
...
default_scope -> { order('category ASC') }
...
end

您应将其替换为一个数字:

1 = Prelim 
2 = Midterm
3 = Semi-finals
4 = Finals
然后在模型中对它们进行如下排序:

class Grade
...
default_scope -> { order('category ASC') }
...
end

如果您不想用@titiboul建议的表格中的数字替换它们。你可以这么做

class Grade
   CATEGORY_IN_ORDER = ["Prelim", "Midterm", "Semi-Finals", "Finals"] 
   scope :ordered_by_category, lambda {"order(FIELD(category,#{CATEGORY_IN_ORDER.join(',')}))"}
end
然后,您可以在任何地方将此范围用作:

 Grade.ordered_by_category.where(YOUR_CRITERIA)
如果不想定义作用域:

Grade.where(YOUR_CRITERIA).order("FIELD(category,#{CATEGORY_IN_ORDER.join(',')})")     
有关按字段排序语法的详细信息,请参见:

如果您不想用@titiboul建议的表格中的数字替换它们。你可以这么做

class Grade
   CATEGORY_IN_ORDER = ["Prelim", "Midterm", "Semi-Finals", "Finals"] 
   scope :ordered_by_category, lambda {"order(FIELD(category,#{CATEGORY_IN_ORDER.join(',')}))"}
end
然后,您可以在任何地方将此范围用作:

 Grade.ordered_by_category.where(YOUR_CRITERIA)
如果不想定义作用域:

Grade.where(YOUR_CRITERIA).order("FIELD(category,#{CATEGORY_IN_ORDER.join(',')})")     
有关按字段排序语法的详细信息,请参见:

预备赛、期中赛、半决赛和决赛是类别的值,因此我现在无法更改它们。我不建议使用默认范围:默认范围在Rails 4中已经不再那么糟糕了。预备赛、期中赛、,半决赛和决赛是类别的值,所以我现在无法更改它们。我不建议使用默认范围:默认范围在Rails 4中已经不再那么糟糕了。@fujisan我认为这与Rails版本无关。只需尝试
Grade.where(“category notnull”).order(“FIELD(category,#{category_IN_order.join(',')})”)
。它的纯mysql语法。我已经使用它作为我的默认范围。再次感谢您提供的解决方案。@fujisan我认为这与rails版本无关。只需尝试
Grade.where(“category notnull”).order(“FIELD(category,#{category_IN_order.join(',')})”)
。它的纯mysql语法。我已经使用它作为我的默认范围。再次感谢您的解决方案。