【问题标题】:Rails eager loading, possible bugRails 急切加载,可能的错误
【发布时间】:2009-07-01 10:25:35
【问题描述】:

在我的 Rails 2.3.2 应用中

我有 2 个模型:

class Post
   has_many :approved_comments, :class_name => 'Comment', :conditions => ['approved => ?', true]
end

class Comment
  belongs_to :post
end

由于某种原因,当我尝试急切加载我的 cmets 时,出现错误

post = Post.find(:first, :conditions => ["permalink=?", permalink], :include => :approved_comments
未定义的方法“加载?”为了 #

来自 Association_preload.rb 第 228 行

这是一个已知问题,还是我做错了什么或不受支持?

我似乎在http://groups.google.com/group/maine-ruby-users-group/browse_thread/thread/796cf58b62f9bc52找到了一些关于此的讨论

【问题讨论】:

  • 对条件使用哈希更安全::conditions => {:approved => true} 和 :conditions => {:permalink => permalink}。我更不知道数据库。
  • 你也可以使用 Post.first(:conditions ...) 代替 Post.find(:first, ....)。还可以考虑使用 named_scopes 来查找已批准的 cmets
  • 谢谢 klew,我会记住这一点,我在休息一年后回到了一些 Rails 开发,所以需要一点时间才能赶上。

标签: ruby-on-rails ruby activerecord eager-loading


【解决方案1】:

FWIW,

我想我可能在这里搞砸了,我在课堂上定义了两次approved_cmets。我发现的不幸的副作用是急切加载与过滤器一起使用并进入左连接地狱。所以我通过选择所有内容并在代码中过滤来解决它。

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    class Post
       has_many :approved_comments, :class_name => 'Comment'
    end
    
    class Comment
      belongs_to :post
    end
    

    然后是这样的:

    Post.find(:all, :joins => :approved_comments, :conditions => ["comments.approved = ? AND permalink = ?", true, permalink], :include => :approved_comments)
    

    这将找到您想要的所有帖子,然后为它们急切加载 cmets。不过,在大型记录集中,我建议不要使用它,它会很慢并且会耗尽您的乘客/杂种实例的内存大小。

    【讨论】:

    • 是的,这就是我更喜欢裸 :include 的原因,新的急切加载将执行 2 个查询,一个裸包含,一个用于 cmets,一个用于帖子,这对内存更友好。这个:samsaffron.com/archive/2008/03/15/… 不是完全固定的
    • 也许,我不喜欢裸包含,因为它很容易失控。这就是为什么我不介意这种事情,它仍然只有 2 个查询,但它肯定只是急切地加载我需要的记录,而不是加载所有内容然后决定它需要什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多