2011-09-02 88 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