Остановить 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. Необязательно, это помогает вам записывать контент-тип блоба.

http://github.com/choonkeat/binary_column_table

Использование прост

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