Rails 3.1 Проблемы с идентификационной карточкой?

Кто-нибудь знает ключевые проблемы, которые имеет функция Rails 3.1 IdentityMap, которая заставила эту функцию отключить по умолчанию? Я уверен, что есть небольшие проблемы, но есть ли какие-то серьезные проблемы, о которых кто-то должен знать, прежде чем включить его для уже созданного приложения Rails 3.1?

Ответ 1

Когда вы смотрите документацию, основная проблема связана с тем, что объекты, управляемые в Identity Map, еще не могут обрабатывать ассоциации, так что это не совсем готов к использованию в реальном мире прямо сейчас.

В документации четко указано, что эта функция все еще находится в разработке, поэтому никто не должен ее использовать в природе.

Ответ 2

Из комментариев в коде:

# Active Record Identity Map does not track associations yet. For example:
#
# comment = @post.comments.first
# comment.post = nil
# @post.comments.include?(comment) #=> true
#
# Ideally, the example above would return false, removing the comment object from the
# post association when the association is nullified. This may cause side effects, as
# in the situation below, if Identity Map is enabled:
#
# Post.has_many :comments, :dependent => :destroy
#
# comment = @post.comments.first
# comment.post = nil
# comment.save
# Post.destroy(@post.id)
#
# Without using Identity Map, the code above will destroy the @post object leaving
# the comment object intact. However, once we enable Identity Map, the post loaded
# by Post.destroy is exactly the same object as the object @post. As the object @post
# still has the comment object in @post.comments, once Identity Map is enabled, the
# comment object will be accidently removed.
#
# This inconsistency is meant to be fixed in future Rails releases.

Ответ 3

Две незначительные проблемы, о которых я знаю:

  • Если вы наследуете модели и хотите переключиться с одной опечатки объекта на другую, сначала нужно удалить свой объект из карты идентификации, а затем создать новый объект. Пример:

    class A < ActiveRecord::Base
    end
    
    class B < ActiveRecord::Base
    end
    
    a = A.create!
    a.update_attribute :type, 'B'
    b = B.find a.id
    #=> #<A:...>
    ActiveRecord::IdentityMap.remove(a) if ActiveRecord::IdentityMap.enabled?
    b = B.find a.id
    #=> #<B:...>
    
  • Еще одна небольшая проблема заключается в том, что идентификационная карта может разобраться в тестах. Поскольку он не обрезает свой репозиторий после каждого теста. Чтобы сделать это, нужно добавить это в конфигурацию тестовых фреймворков. Пример Rspec:

    RSpec.configure do |config|
      config.after :each do
        DatabaseCleaner.clean
        ActiveRecord::IdentityMap.clear
      end
    end
    

Мое мнение таково, что можно использовать идентификационную карту, но частично. Плохая идея включить его по умолчанию для каждого отдельного объекта, но будет хорошей идеей включить его в конкретные модели. Скажем, у вас есть таблица языков, которая представляет собой довольно статическую информацию или может по странам. Почему бы не загрузить их все в карту идентичности. Но с динамическими данными (такими как пользователи или что-то другое, которое постоянно изменяется), нет необходимости хранить это в памяти.