【问题标题】:If attribute is nil then use defaults from hash如果属性为 nil,则使用哈希中的默认值
【发布时间】:2023-03-30 19:51:01
【问题描述】:

我有一个将@lead 与一些默认值合并的模型,如下所示:

DEFAULTS = {
  inflation: 4.224 / 100,
  usage: 12_000, 
  cost: 3250
}.freeze

@lead.attributes.symbolize_keys.reverse_merge!(DEFAULTS)

这一半有效,但如果 @lead 用法为 nil,则不会使用 DEFAULT 用法。如果@lead 的值为nil,我如何将DEFAULT 值应用于@lead only

出于多种原因,我不想在迁移中存储默认值,所以它已经过时了。

谢谢。

【问题讨论】:

  • 你看过Hash#merge的块版本吗?例如@lead.attributes.symbolize_keys.merge(DEFAULTS) { |key, old_val, new_val| old_val.nil? ? new_val : old_val } btw reverse_merge!!(砰)不会有任何影响,因为attributes.symbolize_keys 创建的链我相信是副本而不是参考
  • 效果很好,谢谢!
  • 我会把这个块写成{ |_, old_val, new_val| old_val || new_val }

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


【解决方案1】:
DEFAULTS = {
  inflation: 4.224 / 100,
  usage: 12_000, 
  cost: 3250
}.freeze

if !@lead
    @lead.attributes.symbolize_keys.reverse_merge!(DEFAULTS)
end

! 运算符将在 @lead 为 nil 时使 @lead eq 为假,否则使其为真。

【讨论】:

  • 恐怕你没听懂这个问题。在你的辩护中,它的措辞非常混乱。
  • unless 比 if..not 或 if !x 更惯用,@SergioTulentsev 指出这不是问题的目的
猜你喜欢
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2013-04-16
  • 2021-11-01
  • 2012-11-25
  • 1970-01-01
  • 2015-10-06
相关资源
最近更新 更多