Задача Rake для назначения значений по умолчанию для ошибки выбрасывания хеша - PullRequest
0 голосов
/ 19 марта 2012

У меня есть параметры сериализованного атрибута внутри модели User, которая выглядит следующим образом:

user.preferences
=> 
 @allow_fans=true,
 @approvals={:email=>true, :message=>false},
 @comment_on_an_item={:email=>false, :message=>true},
 @community_invitations={:email=>true, :message=>true},
 @community_requests={:email=>true, :message=>true},
 @flags={:email=>true, :message=>true},
 @follows={:email=>false, :message=>true},
 @likes_and_shares={:email=>false, :message=>true},
 @make_my_email_visible=true,
 @trackbacks_pingbacks={:email=>true, :message=>false}>

Я написал задачу rake, чтобы назначить хэш настроек по умолчанию существующим пользователям, как показано ниже

namespace :user_preferences do
  desc "set default preferences for existing users"
  task :pref_defaults => :environment do
    default = {:comment_on_an_item => {'email' => nil, 'message' => true},
      :likes_and_shares => {'email' => nil, 'message' => true},
      :flags => {'email' => true, 'message' => true},
      :trackbacks_pingbacks => {'email' => true, 'message' => nil},
      :community_invitations => {'email' => true, 'message' => true},
      :approvals => {'email' => nil, 'message' => true},
      :community_requests => {'email' => true, 'message' => true},
      :follows => {'email' => nil, 'message' => true}}

    User.update_all(:preferences => default)
  end
end

Но когда я запускаю задачу rake rake user_preferences:pref_defaults, я получаю ошибку

** Invoke user_preferences:pref_defaults (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute user_preferences:pref_defaults
rake aborted!
PG::Error: ERROR:  syntax error at or near "'---
- :likes_and_shares
- email: 
  message: true
'"
LINE 5: ','---
          ^
: UPDATE "users" SET "preferences" = '---
- :comment_on_an_item
- email: 
  message: true
','---
- :likes_and_shares
- email: 
  message: true
','---
- :flags
- email: true
  message: true
','---
- :trackbacks_pingbacks
- email: true
  message: 
','---
- :community_invitations
- email: true
  message: true
','---
- :approvals
- email: 
  message: true
','---
- :community_requests
- email: true
  message: true
','---
- :follows
- email: 
  message: true
'

Пожалуйста, помогите мне пройти через эту ошибку.

1 Ответ

1 голос
/ 19 марта 2012

см. Комментарии здесь: http://apidock.com/rails/ActiveRecord/Base/update_all/class

Если вы используете update_all, чтобы изменить атрибут, помеченный как сериализованный ( используя ActiveRecord :: Base.serialize), вам нужно позвонить to_yaml себя:

User.update_all({ :preferences => { :first_name => ‘John’, :last_name  => 'Doe' }.to_yaml })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...