0

ハッシュをシリアル化し、ユーザー モデルの 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

どんな助けでも大歓迎です!

4

2 に答える 2

0

新しいキーと値のペアのみをハッシュに追加する必要がある場合は、次のようにします。

usersToNotify.each do |u|               
  u.messages['event'] = event.id
  u.save 
end
于 2012-07-20T13:57:01.903 に答える
0

リテラルと暗黙のハッシュの両方を使用して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があることがわかっている場合を除き、キーに文字列の代わりに記号を使用してみてください。パーサーとのあいまいさを避けるために、ハッシュを中かっこで囲んで、ハッシュ リテラルを渡していることを確認することもできます。

おそらく何か他のことが起こっているので、上記の提案がうまくいかない場合は、実際のエラーメッセージと例で質問を更新してください.

于 2012-07-20T14:00:48.963 に答える