ruby on rails въпроси за събиране на отпадъци за активен запис (ruby 1.8.7 и rails 2.3.5)

Имам следните обекти: марка, 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 по този начин, той свързва ли го с марката автоматично в релси (или изчаква връзката да бъде упражнена. С други думи в do some more stuff записите за точкуване все още ли са наоколо, ако извикам марка .scoring_records, ще извика ли към базата данни?, или отговаря на условията за събиране на боклук? (Предполагам, че не са, защото марката има връзка със scoring_records, така че тъй като марката се споменава по-късно и не отговаря на условията, нито някой от scoring_records , Има ли начин да ги заредите без асоцииране?

въпрос 2: Ако записите няма да бъдат gc'd, има ли все пак scoring_records да отговарят на условията за gc, но да запазите марката и останалите й връзки? Не искам да изтривам scoring_records, просто искам да ги премахна от паметта.


person Joelio    schedule 02.09.2011    source източник


Отговори (1)


Въпрос 1: scoring_records е локална променлива, която не е налична в do_some_more_stuff. Scoring_records, който се добавя от has_many, не е променлива, това е метод и не можете да го присвоите. Трябва да прочетете за променливите обхвати. Това е добро начало: http://www.techotopia.com/index.php/Ruby_Variable_Scope. Променливата scoring_record в кода, който сте предоставили, няма ефект върху scoring_records в променливата на марката.

Ако този код беше в класа на марката, той щеше да присвои записите за точкуване, върнати от находката, към асоциацията, като го асоциира незабавно, но щеше да се запази само когато се запази. Не за променливата марка, а за самия обект.

Въпрос 2: scoring_records не са свързани с марката, техният обхват е блокът.

person jcnnghm    schedule 05.09.2011
comment
Моят въпрос №1 не беше ясен, знам разликата между локална променлива и връзка. Искам да знам дали зареждането на данните по този начин също зарежда връзката. Така че, ако извикам ScoringRecords.find(:all,:conditions =› [computed_date = ?,today], :order =› 'brand.id', тогава след това направете brand.scoring_records, релсите ще отидат ли в db , или тази връзка вече е заредена ефективно. - person Joelio; 05.09.2011
comment
Не е, за да заредите връзката предварително, трябва да добавите клауза за включване към вашето find повикване. - person Maurício Linhares; 05.09.2011
comment
Това не натоварва отношенията. За да заредите предварително връзката, можете да направите brands = Brand.includes(:scoring_records) - person jcnnghm; 06.09.2011