Как я могу сказать Activerecord, чтобы не загружать столбцы blob, если явно не задано? В моей старой базе данных есть довольно большие капли, которые должны быть исключены для «нормальных» объектов.Остановить Activerecord от загрузки столбца Blob
ответ
Я считаю, что вы можете попросить AR загрузить определенные столбцы в вызове найти:
MyModel.find(id, :select => 'every, attribute, except, the, blobs')
Однако это необходимо будет обновляться по мере добавления столбцов, так что это не идеал. Я не думаю, что есть какой-либо способ специально исключить один столбец в рельсах (и ни один выбор SQL).
Я думаю, вы могли бы написать это следующим образом:
MyModel.find(id, :select => (MyModel.column_names - ['column_to_exclude']).join(', '))
испытания эти, прежде чем принять мое слово, хотя. :) Ответ
FD является в основном правильно, но ActiveRecord doesn't currently accept an array как: выберите аргумент, так что вам нужно, чтобы присоединиться желательные столбцы в строку с разделителями запятыми, например, так:
desired_columns = (MyModel.column_names - ['column_to_exclude']).join(', ')
MyModel.find(id, :select => desired_columns)
Чистый подход не требует каких-либо изменений, как вы закодировать еще где в вашем приложении, т.е. не баловаться с :select
опций
по какой причине вам нужно или выбрать для хранения больших двоичных объектов в базах данных. Однако вы не хотите смешивать столбцы blob в той же таблице, что и обычные атрибуты . BinaryColumnTable помогает хранить ВСЕ капли в отдельной таблице, управляемой прозрачно с помощью модели ActiveRecord. Необязательно, это помогает вам записывать контент-тип блоба.
Использование простой
Member.create(:name => "Michael", :photo => IO.read("avatar.png"))
#=> creates a record in "members" table, saving "Michael" into the "name" column
#=> creates a record in "binary_columns" table, saving "avatar.png" binary into "content" column
m = Member.last #=> only columns in "members" table is fetched (no blobs)
m.name #=> "Michael"
m.photo #=> binary content of the "avatar.png" file
Я просто побежал в это с помощью рельса 3.
К счастью, это было не так уж трудно решить. Я установил default_scope
, который удалил определенные столбцы, которые я не хотел получать. Например, в модели у меня было текстовое поле xml, которое могло бы быть довольно длинным, которое не использовалось в большинстве представлений.
default_scope select((column_names - ['data']).map { |column_name| "`#{table_name}`.`#{column_name}`"})
Глядит из раствора, что я должен был отобразить столбцы полностью уточненные версии, чтобы я мог продолжать использовать эту модель через отношения без двусмысленности в атрибутах. Позже, когда вы хотите, чтобы поле просто зацепило другое .select(:data)
, включите его.
Привет, Криш. Я создал плагин [Rails, основанный на вашей идее с именем `lazy_columns`] (https://github.com/jorgemanrubia/lazy_columns). Благодаря! – jmanrubia 2013-01-13 09:01:29
Исправлено второе предположение, согласно наблюдению Зеке. Спасибо @Zeke. – 2015-01-04 20:25:58