Как я могу сказать Activerecord, чтобы не загружать столбцы blob, если они явно не заданы? В моей старой базе данных есть довольно большие капли, которые должны быть исключены для "нормальных" объектов.
Остановить Activerecord от загрузки столбца Blob
Ответ 1
Я просто столкнулся с этим использованием рейка 3.
К счастью, это было не так сложно решить. Я установил default_scope
, который удалил определенные столбцы, которые я не хотел получать. Например, в модели у меня было текстовое поле xml, которое могло быть довольно длинным, которое не использовалось в большинстве представлений.
default_scope select((column_names - ['data']).map { |column_name| "`#{table_name}`.`#{column_name}`"})
Вы увидите из решения, которое мне пришлось сопоставить столбцам с полнофункциональными версиями, чтобы я мог продолжать использовать модель через отношения без двусмысленности в атрибутах. Позже вы захотите, чтобы поле просто нажало на другой .select(:data)
, чтобы включить его.
Ответ 2
Я считаю, вы можете попросить AR загрузить определенные столбцы в ваш вызов, чтобы найти:
MyModel.find(id, :select => 'every, attribute, except, the, blobs')
Однако это нужно будет обновить по мере добавления столбцов, поэтому оно не будет идеальным. Я не думаю, что есть какой-либо способ специально исключить один столбец в рельсах (ни в одном выборе SQL).
Я думаю, вы могли бы написать это следующим образом:
MyModel.find(id, :select => (MyModel.column_names - ['column_to_exclude']).join(', '))
Протестируйте их, прежде чем принять слово за это.:)
Ответ 3
Ответ на fd в основном прав, но ActiveRecord в настоящее время не принимает массив в качестве аргумента: select, поэтому вам нужно будет присоедините нужные столбцы к строке с разделителями-запятыми, например:
desired_columns = (MyModel.column_names - ['column_to_exclude']).join(', ')
MyModel.find(id, :select => desired_columns)
Ответ 4
Чистый подход, требующий НЕТ ИЗМЕНЕНИЙ, к тому, как вы кодируете другое место в вашем приложении, то есть не возиться с параметрами :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