【问题标题】:categories ordering not as expected类别排序不符合预期
【发布时间】:2016-04-10 22:24:51
【问题描述】:

我有一个包含许多类别的类别模型,它有一个名为 tag 的属性。

一个主要类别有一个标签,例如 1 并且一个子类别有一个标签 1-1

因此,为了以正确的顺序一个接一个地显示这些类别,我使用以下标记对它们进行排序

@categories = Category.order("tag ASC")

但由于某种原因,假设我有标签,

[1, 1-1, 1-2, 3,4, 10, 10-1]

这是我想要的顺序

排序变成

[1, 1-1, 1-2, 10,10-1, 3,4 ]

我该如何解决?

【问题讨论】:

  • 标签属性是字符串吗?
  • 啊,是的,是这个问题吗?
  • @JonathanLonowski 感谢您的回复。现在我明白会发生什么。有没有办法在不更改数据库中的标签类型的情况下“解决”问题?

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

这是因为tag 是一个字符串,如果您订购字符串ASC,您将按按字母顺序 订购它们。您必须编写一个自定义方法来对记录进行排序。

假设您的排序方法称为order_by_tag。然后您可以像这样订购您的类别:Category.all.sort_by(&:order_by_tag)

请注意,如果您不想每次都迭代大量记录,这会更加困难。

要编写自定义排序方法,您必须想出一种方法来计算标签的。你可以这样做:

def order_by_tag
  tag.split('-').reverse.each_with_index.map do |tag, index| 
    tag.to_i * 2**(index + 1) }
  end.reduce(:+) # => 1*(2^1) + 10*(2^2) = 42
end

或者,更短:

def order_by_tag
  tag.split('-').reverse.each_with_index.map { |tag, index| tag.to_i * 2**(index + 1) }.reduce(:+) # => 1*(2^1) + 10*(2^2) = 42
end

但是这个例子假设了一个可能的标签值的限制。

编辑:

有一个更简单的方法。如果返回数组,则可以按多个属性对记录进行排序:

def order_by_tag
  tag.split('-').map { |t| t.to_i } # "10-1" => [10, 1]
end

这样,Rails 将按数组的第一个成员对记录进行排序,然后是第二个,依此类推。这种方式比我的第一个示例好得多,因为它更容易并且您的类别值不会重叠。

总结:

@categories = Category.all.sort_by(&:order_by_tag)

def order_by_tag
  tag.split('-').map { |t| t.to_i }
end

【讨论】:

  • 我只是提供了一个例子。
  • 请查看我最新编辑中提供的示例。比第一个好多了。
  • 非常感谢您,感谢您的努力!
  • 很高兴能帮到你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
相关资源
最近更新 更多