【发布时间】:2015-10-16 08:34:21
【问题描述】:
我有一个名为items 的表,其中包含type 列。
此列可以具有以下值之一:
rock
paper
scissor
在我的翻译文件中:
en:
rock: Stone
paper: Wood
scissor: Weapon
如何使用 ActiveRecord 获取结果并按翻译值排序?
显然,如果我这样做 Item.where(something: true).order('name asc'),我会得到按数据库中的值排序的结果 (rock),而不是转换后的值 (Stone)。
我知道一些 ruby 方法,例如 sort_by 和 sort 来使用 ruby 订购项目,但出于性能原因,我想在 ActiveRecord 中订购结果。
【问题讨论】:
-
有多少种独特的类型?如果列表相对较短,您可以构建一个
order语句来执行此操作。 MySQL 有一个FIELD() method,在 Postgres 中你可以构建一个case statement。 -
@cschroed 只有 3 种类型(石头、纸、剪刀)
-
@cschroed 你知道如何在不知道有多少类型的情况下解决这个问题吗?
-
您的答案的通用版本类似于
translation = ["rock", "paper", "scissor"].map{ |name| "WHEN type = '#{name}' THEN '#{I18n.t(name)}'" }.join(" "); Item.select("*, CASE #{translation} END AS translated_type").order("translated_type")。但是对于一个非常庞大的列表,这可能会打破查询中允许有多少WHEN条目的限制。 -
@cschroed 是的,我也想到了,但另一个列表包含近 740 个项目。遍历列表就这么多!
标签: ruby-on-rails ruby postgresql activerecord localization