【问题标题】:How do I find and replace 'nil' values of Ruby hash with "None" or 0?如何查找 Ruby 哈希的“nil”值并将其替换为“None”或 0?
【发布时间】:2019-10-04 18:14:03
【问题描述】:

我正在尝试深入到数组嵌套哈希的迭代中的每个值,并将所有 nil 值替换为“无”或 0 之类的值。请查看我的代码,该代码显然不起作用。在将它传递给 Rails 中的视图进行迭代和渲染之前,我需要解决这个问题:

我的控制器:

def show
  results = Record.get_record(params[:trans_uuid])
  if !results.empty?
    record = results.map { |res| res.attributes.symbolize_keys }
    @record = Record.replace_nil(record) # this calls method in Model
  else
    flash[:error] = 'No record found'
  end
end

我的模特:

def self.replace_nil(record)
  record.each do |r|
    r.values == nil ? "None" : r.values
  end
end

record 在传递给模型方法self.replace_nil(record 时看起来像这样:

[{:id=>1, :time_inserted=>Wed, 03 Apr 2019 15:41:06 UTC +00:00, :time_modified=>nil, :request_state=>"NY", :trans_uuid=>"fe27813c-561c-11e9-9284-0282b642e944", :sent_to_state=>-1, :completed=>-1, :record_found=>-1, :retry_flag=>-1, :chargeable=>-1, :note=>"", :bridge_resultcode=>"xxxx", :bridge_charges=>-1}]

【问题讨论】:

  • 我不确定这样做的原因,但听起来你可以在视图上为零时处理这种情况(可能是视图助手)。您正在控制器上格式化值,听起来像是属于视图的东西(例如,您可以执行@record[:time_modified] || 'None'
  • .each 应该只在你只想要副作用而不关心返回值的情况下使用。就像在每次迭代都打印到缓冲区的视图中一样。
  • 正如@arieljuod 所说,很高兴看到您在这里遇到的情况,也许有更简单的方法。
  • 对于一个数组,你可以这样做:my_array.map{ |value| value || "None" }

标签: ruby-on-rails ruby hash null


【解决方案1】:

each 不会“保留”您在块内产生的值。请改用map

def self.replace_nil(record) 
  record.map do |r| 
    r.values.nil? ? "None" : r.values
  end 
end

事实上,有一种方法可以做到这一点; transform_values:

record.transform_values do |value|
   value.nil? ? 'None' : value
end

我意识到使用 Rails 你可以只使用presenceor 运算符:

record.transform_values do |value|
  value.presence || 'None'
end

【讨论】:

  • 如果所有嵌套元素都需要它,也可以使用 deep_transform_values
猜你喜欢
  • 2014-06-15
  • 2013-07-21
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2013-07-06
  • 2016-04-23
  • 2010-12-16
  • 2011-12-19
相关资源
最近更新 更多