【问题标题】:Rails 4 - order by translated / localized valueRails 4 - 按翻译/本地化值排序
【发布时间】: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_bysort 来使用 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


【解决方案1】:

我设法通过使用CASE 语句解决了这个问题。

Item.select("*,
  CASE 
    WHEN type = 'rock' THEN '#{I18n.t(:rock)}' 
    WHEN type = 'paper' THEN '#{I18n.t(:paper)}' 
    WHEN type = 'scissor' THEN '#{I18n.t(:scissor)}'
  END AS translated_type
")
.where(something: true)
.order('translated_type asc')

这在我的情况下很好用,因为我知道需要哪些类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-14
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多