2011-08-02 9 views
10

¿Alguien sabe los problemas clave que tiene la característica Rails 3.1 IdentityMap que ha forzado a la característica a deshabilitarse por defecto? Estoy seguro de que hay problemas específicos menores, pero ¿hay algún problema importante que alguien deba tener en cuenta antes de habilitarlo para una aplicación Rails 3.1 ya construida?Rails 3.1 ¿Problemas con el mapa de identidad?

+4

Solo FYI, [IdentityMap se ha eliminado] (https://github.com/rails/rails/pull/5261) – Zabba

Respuesta

8

Cuando mira the documentation, el problema principal que se plantea es que los objetos administrados en el Mapa de identidad no pueden manejar asociaciones todavía, por lo que no está listo para el uso del mundo real en este momento.

La documentación indica claramente que la característica aún está en desarrollo, por lo que nadie debería estar realmente usándola en la naturaleza.

+0

IdentityMap se eliminó en Rails 4, por lo que es posible que necesitemos utilizar este enlace https: // github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/identity_map.rb –

9

Desde el comments in the code:

# 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

Dos problemas menores, que me cuenta son:

  1. Si la herencia de los modelos, y que desea cambiar de un typo del objeto a otro, a continuación, primero necesita eliminar su objeto del mapa de identidad y luego crear un nuevo objeto. Ejemplo:

    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:...> 
    
  2. Otro pequeño problema es que el mapa de identidad puede Mees la hora de las pruebas. Como no trunca su repositorio después de cada prueba. Para hacerlo, uno necesita agregar eso a las configuraciones de la plataforma de prueba. Rspec ejemplo:

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

Mi opinión es que la aplicación identidad puede ser utilizado, pero parcialmente. Es una mala idea habilitarlo por defecto para cada objeto individual, pero será una buena idea habilitarlo para modelos específicos. Digamos que tiene una tabla de idiomas, que es bastante información estática, o puede por países. ¿Por qué no cargarlos todos en el mapa de identidad? Pero, con datos dinámicos (como usuarios, o algo diferente, que cambia constantemente), no hay necesidad de almacenar eso en la memoria.

+2

Pero, ¿cómo activar el mapa de identidad para un solo modelo? – rafamvc