Рекурсивные особенности to_yaml
Если необходимо сериализовать/десериализовать какой-то объект, то yaml формат хорошо для этого подходит.
В моем проекте мы записывали объекты в очередь, использую yaml-сериализацию. На тестах все было хорошо. Но на живом эта самая сериализация стала выполняться очень долго.
Оказалось, что если у объекта есть связные объекты, то он их тоже засовывает в yaml, а если таких объектов очень много, то это будет сложная операция. Понятно, что в примитивных тестах этого было не видно, а подумать хорошо головой в тот раз не получилось.
# test.rb
u = User.find 1
print u.to_yaml
u.projects
print u.to_yaml
# result.yml
--- !ruby/object:User
attributes:
login: user1
attributes_cache: {}
--- !ruby/object:User
attributes:
login: user1
attributes_cache: {}
projects:
- !ruby/object:Project
attributes:
cost_update_date: "2008-01-14"
max_error_wait: "7"
name: test2
created_at: 2009-04-23 12:45:23+04
attributes_cache: {}
- !ruby/object:Project
attributes:
cost_update_date: "2008-01-14"
max_error_wait: "7"
name: test
created_at: 2009-04-23 12:45:23+04
attributes_cache: {}
Решена была эта проблема просто: object.attributes.to_yaml
.
Это такой забавный баг, что мне хочется выразить его в танце.