Rails 3.1 Identity Map问题?

时间:2011-08-02 00:03:05

标签: ruby-on-rails ruby-on-rails-3 identity-map

有谁知道Rails 3.1 IdentityMap功能的主要问题是强制默认禁用该功能?我确信存在一些小问题,但在为已经构建的Rails 3.1应用程序启用它之前,是否有任何人应该注意的主要问题?

3 个答案:

答案 0 :(得分:9)

来自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.

答案 1 :(得分:8)

当你看the documentation时,提出的主要问题是身份地图中管理的对象还无法处理关联,所以它现在还没有为现实世界的使用做好准备。

文档清楚地表明该功能仍处于开发阶段,因此没有人应该真正在野外使用它。

答案 2 :(得分:3)

我知道的两个小问题是:

  1. 如果继承模型,并且想要从一个对象的错误切换到另一个,则首先需要从身份映射中删除对象,然后创建一个新对象。例如:

    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. 另一个小问题是身份地图可能会在测试中发现它。因为它不会在每次测试后截断其存储库。要做到这一点,需要将其添加到测试框架配置中。 Rspec示例:

    RSpec.configure do |config|
      config.after :each do
        DatabaseCleaner.clean
        ActiveRecord::IdentityMap.clear
      end
    end
    
  3. 我的观点是可以使用身份地图,但部分使用。默认情况下为每个单个对象启用它是一个坏主意,但将它启用到特定模型是个好主意。比如,你有一个语言表,这是非常静态的数据,或者可能是国家。为什么不将它们全部加载到身份图中。但是,对于动态数据(如用户或不同的东西,不断变化),无需将其存储在内存中。