В моем текущем приложении rails я вытаскиваю много данных из базы данных в память, чтобы начать многолетнюю фоновую задачу, которую я не хочу ударять по базе данных каждый 5 секунд.Обновление загруженных ассоциаций в памяти
Это все работает отлично, но у меня есть неэлегантный код, с которым я бы хотел избавиться, если это возможно.
Для примера у меня есть ситуация, когда у меня есть модель пользователя, и что модель пользователя может ссылаться на другие модели пользователей в виде контактов, которые, в свою очередь, могут ссылаться на первую модель пользователя и так далее. Это моделируется следующим образом (благодаря Милан Novota для его ранней помощи): -
class User < ActiveRecord::Base
has_many :contact_records, :foreign_key => :owner_id
has_many :contacts, :through => :contact_records, :class_name => "User"
end
class ContactRecord < ActiveRecord::Base
belongs_to :owner, :class_name => "User"
belongs_to :user
end
Так что теперь я могу ввести
user_a_contacts = user_a.contact_records
=> [user_b, user_c]
и получить все контакты для пользователя а. Теперь предположим, что я хочу, чтобы получить контакты пользователя B через пользователя А (не могу понять, почему я бы, но это только пример!)
user_b_contacts = user_a_contacts.first.contact_records
=> [user_a, user_c]
Теперь я могу получить имя пользователя А (в свернутой, кольцевой, никогда -use-in-the-real-world)
user_a_name = user_b_contacts.first.name
=> "Jamie"
Пока что так хорошо. Теперь я могу изменить имя пользователя А
user_a.name = "Sandy"
=> "Sandy"
Если доступ к имени пользователя А снова, как и раньше из базы данных я получаю
user_a_name = user_b_contacts.first.name
=> "Sandy"
Однако, если я готов нагруженным и сохранил это значение в памяти я получаю
user_a_name = user_b_contacts.first.name
=> "Jamie"
но делает следующее дает мне правильный ответ
user_a.name
=> "Sandy"
Справедливо, что при желании загрузка создает различные пользовательские объекты для оригинальных пользователей и тех, кто загружен с объектов ContactRecord.
Итак (наконец-то!) Мой вопрос заключается в следующем: -
На данный момент, я bodged вокруг этого, используя
@users.each.detect{|user| user == user_b_contacts.first}
(где @users является нетерпеливый загруженным список объектов пользователя). Есть ли способ, чтобы я мог обновлять загруженные пользователем объекты User?
Пожалуйста, обратите внимание: -
а) Я готов заряжания с помощью следующей
User.find(:all, :include => [ {:contact_records => :contacts] } ])
б) Очевидно, что это не реальный код, что я работаю с, но было бы еще больше объяснение и изложение, чтобы показать этот код, и я думаю, что вам надоело! Поверьте мне, что реальный пример, который я использую DOES, требует этой структуры, чтобы работать правильно, как причудливо, как может выглядеть!;)
c) Возможно, я ввел опечатки и ошибки при восстановлении примера, но, пожалуйста, проигнорируйте их. Все, что мне нужно знать, - это возможность перезагрузки пользователей с нетерпением, без попадания в базу данных.
Большое спасибо заранее!
ОБНОВЛЕНИЕ: Как указано ниже, данные модели не будут сохранены в базе данных до самого конца процесса, так что перезагрузка не будет работать, поскольку данные в базе данных не будут изменены.