【问题标题】:How can I replace null value with n/a in ruby on rails?如何在 ruby​​ on rails 中用 n/a 替换空值?
【发布时间】:2021-10-21 06:08:22
【问题描述】:

我正在研究通过 rails 中的 chartkick 和 chart.js 创建的动态图表。

.

数据为空不是问题。问题是我想将 null/empty 显示为 n/a。

我的图表如下所示:

为了解决这个问题,我首先通过下面提到的代码更新数据库:

Roster.where(caste_group: "").update_all(caste_group:"n/a")

但这完全不是我想要的。每次更新数据库效率不高。 然后我使用了转换键助手。代码如下

    caste_group = Roster.group(:caste_group).count
   @caste_group = caste_group.transform_keys{ |key| key==""? 
   "n/a":key }

这里Roster 是由以下属性caste_group 作为字符串和用户选择caste_group 作为下拉列表组成的模型。 使用这个转换键助手,我得到了不显示空值的结果。 null/empty 值不会重命名为 n/a。 我在视图中的代码如下

 = line_chart @event_chart,discrete:true, legend: "bottom",curve: false,
           colors: ["#67b55e","#d43766","#729be0"]

【问题讨论】:

  • null 值到底是什么?您正在测试 key 是否为空字符串。
  • @user1934428 是的,密钥是一个空字符串。我想将空字符串更改为 n/a
  • 代码是合理的,虽然我会(为了安全起见)将它替换为key.empty,这样如果由于一些编程错误,密钥恰好是nil,你就会得到一个异常。

标签: ruby-on-rails ruby chart.js chartkick


【解决方案1】:

我认为你可以在很多层面上做到这一点,所以取决于你需要什么。 解决此问题的一种方法是在数据库中设置默认值。所以每次你的模型用 null 保存时,它实际上会保存为“n\a”。

您可以像这样运行迁移:

change_column_default :rosters, :caste_group, "n\a"

但也许您不想编辑数据库中的所有数据。在这种情况下,您可以在模型或演示者级别执行此操作。我认为您从助手发布的代码没问题。你不满意吗?

【讨论】:

  • 我不想更改数据库。我只想更改视图的显示,即我的图表。如果更改数据库,整个项目将一团糟。所以我不想这样做。可悲的是我没有通过 transform_keys 得到结果。 @亚历山大
【解决方案2】:

如果您的查询可以返回 null 和“”,例如

Roster.group(:caste_group).count
{
  nil=>12,
  ''=>123,
  'name_first'=>2
}

这会有所帮助

sql = <<-SQL
  SELECT
    CASE
    WHEN caste_group IS NULL
    THEN 'n/a'
    WHEN caste_group=''
    THEN 'n/a'
    ELSE caste_group
    END AS caste_group,
    count(*)
  FROM rosters
  GROUP BY 1
SQL
result = ActiveRecord::Base.connection.execute(sql).to_a

这会将 NULL 或 '' 编译为 'n/a'。

示例结果:

[
  {"caste_group"=>"n/a", "count"=>"1"},
  {"caste_group"=>"name_first", "count"=>"2"}
]

接下来您可以将其转换为所需的哈希值。

result.each_with_object({}) { |caste_group, res| res[caste_group['caste_group']] = caste_group['count'] }

例如

{"n/a"=>"1", "name_first"=>"2"}

【讨论】:

    【解决方案3】:

    谢天谢地,我解决了这个问题。 我的问题是我已经将数据库更新为“n/a”。因此,当我通过 transform_keys 更改密钥时,我遇到了问题。 之后,我将 n/a 重命名为“N/A”并为我解决。

       caste_group = Roster.group(:caste_group).count
    @caste_group = caste_group.transform_keys{ |key| key==""? "N/A":key }
    

    我发布答案是因为它将来可能对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-30
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      相关资源
      最近更新 更多