【问题标题】:rails merge hash syntaxrails 合并哈希语法
【发布时间】:2012-07-20 13:51:09
【问题描述】:

我有一个观察者,它序列化一个哈希并将其作为我的用户模型上的 TEXT 字段保存到 mySQL 数据库中。我遇到的问题是我试图向现有哈希添加一个新的键/值,而不是覆盖它。它似乎只是在覆盖它。 我的合并语法不正确吗?

这是我的观察员:

class NotificationObserver < ActiveRecord::Observer
  observe :event

  def after_update(event)
    usersToNotify=event.following

    usersToNotify.each do |u|               
        u.messages.merge! 'event'=>event.id
        u.save 
    end
  end
end

感谢任何帮助!

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    它适用于我使用 Ruby 1.9.3,同时使用文字和隐式哈希。例如:

    [1] pry(main)> foo = {foo: 'bar'}
    => {:foo=>"bar"}
    [2] pry(main)> bar = {bar: 'baz'}
    => {:bar=>"baz"}
    [3] pry(main)> foo.merge! bar
    => {:foo=>"bar", :bar=>"baz"}
    [4] pry(main)> foo.merge! alice: 'bob'
    => {:foo=>"bar", :bar=>"baz", :alice=>"bob"}
    

    您可以尝试使用符号而不是字符串作为键,除非您知道自己有 HashWithIndifferentAccess。您可能还希望通过将散列括在大括号中来确保传递散列文字,以避免与解析器产生任何歧义。

    可能还有其他问题,所以如果上述建议对您不起作用,请确保使用实际错误消息和示例更新您的问题。

    【讨论】:

    • 感谢它,它把我推向了正确的方向。我所做的语法在控制台中正确工作。事实证明,我真正想要的是一个散列,每个键都有一个值数组。
    【解决方案2】:

    如果您需要向哈希添加新的键值对,请执行以下操作:

    usersToNotify.each do |u|               
      u.messages['event'] = event.id
      u.save 
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2017-02-05
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      相关资源
      最近更新 更多