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 таким образом, он автоматически связывает его с брендом в rails (или он ждет, пока связь будет реализована. Другими словами, если я сделаю еще кое-что, записи с скорингом все еще будут доступны, если я вызову бренд .scoring_records, будет ли он обращаться к базе данных? Или будет иметь право на сборку мусора? (Я предполагаю, что нет, потому что бренд имеет отношение к скоринг_рекордам, поэтому, поскольку бренд упоминается позже и не подходит, ни один из скоринг_рекордов , Есть ли способ загрузить их без ассоциации?

вопрос 2: Если записи не будут объединены в общий список, можно ли каким-либо образом сделать скоринг_записи подходящими для общего сбора мусора, но сохранить бренд и остальные его отношения? Я не хочу удалять 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 в переменной brand.

Если бы этот код находился в классе брендов, он бы присвоил оценочные записи, возвращенные находкой, ассоциации, связав ее немедленно, но сохраняя только при сохранении. Не для переменной бренда, а для самого объекта.

Вопрос 2: scoring_records не связаны с брендом, их областью действия является блок.

person jcnnghm    schedule 05.09.2011
comment
Мой вопрос № 1 не был ясен, я знаю разницу между локальной переменной и отношением. Я хочу знать, загружает ли таким образом данные отношения. Итак, если я вызову ScoringRecords.find(:all,:conditions =› [computed_date = ?,today], :order =› 'brand.id' , то после этого выполните brand.scoring_records, отправятся ли рельсы в БД , или эта связь уже загружена эффективно. - person Joelio; 05.09.2011
comment
Это не так, чтобы загрузить отношение заранее, вы должны добавить предложение include к вашему вызову find. - person Maurício Linhares; 05.09.2011
comment
Что не грузит отношения. Чтобы предварительно загрузить отношения, вы можете сделать brands = Brand.includes(:scoring_records) - person jcnnghm; 06.09.2011