2010-01-24 4 views
1

Обычно рельсы загружают данные с помощью: select => "*" из базы данных. Я знаю, что смогу это изменить. Но я хотел бы пойти другим путем: всегда выбирайте только «id» и автоматически загружайте атрибуты позже, когда они понадобятся.рельсы ленивая загрузка атрибутов модели

Пример: доступ к описанию пользователя должен быть, если он еще загружен. если нет, вызовите «SELECT description FROM users WHERE id = # {self.id}» и установите его.

Кто-нибудь знает, есть ли плагин для рельсов, который это делает? Или как его реализовать?

Спасибо, Корин

+2

Я бы не стал это делать. Если у вас есть таблица/модель с таким количеством столбцов, вам нужно это, тогда вам нужно пересмотреть свой дизайн приложения. – ffoeg

+0

Аналогично, если у вас достаточно столбцов, чтобы это было проблемой, наверняка у вас возникнет проблема с созданием одного SQL-запроса для каждого атрибута в каждой модели? – Gareth

+0

Большим преимуществом было бы то, что отдельные атрибуты можно было бы получить с помощью гораздо более быстрого хранения ключей/значений, таких как memcache или couchdb. Интересно, как большие сайты, такие как facebook и т. Д., Управляют своим кэшированием, сохраняя при этом целостность данных (foreign_keys кажется невозможным с такими огромными базами данных?) – gucki

ответ

0

Быстрый поиск Google оказался this, но я с glongman. Я не могу себе представить, какая проблема производительности потребует этого ...

0

Уместно просто реорганизовать ваши основные «огромные поля» в отдельную модель (например, BookBody), которая обычно не нужна при работе с моделями оптом. Кроме того, вы можете использовать :select опции искателей

BookWithHugeBlobOfText.find(:first, :select=>"only,small,columns") 

записей, выбранные таким образом будет доступна только для чтения, так как философия Rails говорит (и это справедливо!), Что вам нужно иметь всех данных о модели проверить его , Легкая загрузка была бы неплохой, но, поскольку она стоит сейчас, я бы отговорил вас от использования плагинов monkeypatch для этого.

Другой вариант - создать представление SQL, которое будет содержать только легкие поля и запускать ваши операционные системы.

+0

У меня нет больших таблиц blob, но очень загруженный сайт с высокодинамичным кэшированием, поэтому даже кэширование фрагментов невозможно. Поэтому я подумал, что когда я загружаю первичный ключ из основной базы данных и всего остального, используя хранилище ключей/значений (memcache, ..), я мог бы масштабироваться намного лучше, все еще имея все данные в db и тем самым имея возможность поддерживать надлежащее целостность с использованием внешних ключей и т.д. – gucki

1

Я написал плагины Rails, которые делают именно это lazy_columns. Обратите внимание, что гораздо лучший подход заключается в создании новой модели с большими столбцами, которые вы хотите загрузить по запросу (поскольку Rails-объекты, связанные с нагрузкой, по умолчанию не работают).

Смежные вопросы