ruby on rails活动记录垃圾收集问题(ruby 1.8.7和rails 2.3.5)

时间:2011-09-02 19:17:31

标签: ruby-on-rails memory-leaks garbage-collection

我有以下实体:品牌,scoring_records。品牌has_many scoring_records。

如果我有一个街区,我正在开发这样一个品牌:

 brands.each{|brand|

     # do some stuff
     brand.do_some_stuff

     some_scoring_records = ScoringRecords.find(:all,:conditions => ["computed_date = ?",today], :order => 'brand.id' )

    #  do some more stuff
    brand.do_some_more_stuff(brand)

    brand.do_even_more_stuff(brand)
 }

问题1:当我加载这样的scoring_records时,它是否会在rails中自动将其与品牌相关联(或者它是否等待关系被执行。换句话说,做更多的东西是得分记录仍然存在,如果我打电话给brand.scoring_records,它会调用数据库吗?还是有资格进行垃圾收集?(我猜他们不是,因为该品牌与scoring_records有关系,所以既然品牌后来被引用,而且没有资格,也没有scoring_records。有没有办法加载这些没有关联?

问题2:如果记录不是gc'd,那么无论如何都要让scoring_records有资格获得gc,但保持品牌,以及其余的关系?我不想删除scoring_records,我只想将它们从内存中删除。

1 个答案:

答案 0 :(得分:1)

问题1:scoring_records是do_some_more_stuff中不可用的局部变量。 has_many添加的scoring_records不是变量,它是一种方法,您无法分配它。您需要阅读变量范围。这是一个好的开始:http://www.techotopia.com/index.php/Ruby_Variable_Scope。您提供的代码中的scoring_record变量对品牌变量中的scoring_records没有影响。

如果此代码在品牌类中,它会将查找返回的评分记录分配给关联,立即关联,但仅在保存时保留。不是品牌变量,而是物品本身。

问题2:scoring_records与品牌无关,其范围是块。