2011-09-02 86 views
1

我有以下实体:brand,scoring_records。品牌has_many scoring_records。ruby​​ on rails积极记录垃圾回收问题(ruby 1.8.7和rails 2.3.5)

如果我在那里,我对品牌工作的这样一个块:

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这样的,它是与该品牌自动导轨(是否关联或等待关系被执行换句话说,如果我打电话给brand.scoring_records,它会调用数据库还是有资格进行垃圾回收,那么还有更多的东西是评分记录吗(我猜他们不是,因为品牌与得分记录有关系,所以因为后来引用了品牌,而不符合条件,所以没有任何记分记录。是否有方法在没有关联的情况下加载这些品牌?

问题2:如果记录不会被记录下来,有没有办法让记分记录符合gc的条件,但保持品牌和其他关系?我不想删除scoring_records,我只是想从内存中删除它们。

回答

1

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

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

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

+0

我的问题#1不清楚,我知道局部变量和关系之间的差异。我想知道如果以这种方式加载数据也会加载关系。因此,如果我打电话给ScoringRecords.find(:all,:conditions => [“computed_date =?”,today),:order =>'brand.id',那么做brand.scoring_records,数据库,或者是已经有效加载的关系 – Joelio

+0

不是,加载关系之前,你必须添加一个包含子句到你的** find **调用 –

+0

这不会加载关系。可以做品牌= Brand.includes(:scoring_records) – jcnnghm