Остановить Activerecord от загрузки столбца BLOB-объектов - PullRequest
10 голосов
/ 18 сентября 2008

Как я могу сказать Activerecord не загружать столбцы BLOB-объектов, если это явно не требуется? В моей прежней БД есть несколько довольно больших пятен, которые нужно исключить для «обычных» объектов.

Ответы [ 4 ]

12 голосов
/ 18 июля 2010

Я только что наткнулся на это, используя рейку 3.

К счастью, это было не так сложно решить. Я установил default_scope, который удалил определенные столбцы, которые я не хотел из результата. Например, в моей модели было текстовое поле xml, которое могло быть довольно длинным и не использовалось в большинстве представлений.

default_scope select((column_names - ['data']).map { |column_name| "`#{table_name}`.`#{column_name}`"})

Из решения вы увидите, что мне пришлось сопоставить столбцы с полностью определенными версиями, чтобы я мог продолжать использовать модель через отношения без неоднозначностей в атрибутах. Позже, когда вы захотите, чтобы поле просто прикрепилось к другому .select(:data), чтобы оно было включено.

4 голосов
/ 30 августа 2009
Ответ

fd в основном правильный, но ActiveRecord в настоящее время не принимает массив в качестве аргумента: select, поэтому вам необходимо объединить нужные столбцы в строку с разделителями-запятыми, например

desired_columns = (MyModel.column_names - ['column_to_exclude']).join(', ')
MyModel.find(id, :select => desired_columns)
4 голосов
/ 18 сентября 2008

Я полагаю, вы можете попросить AR загрузить определенные столбцы в вашем вызове, чтобы найти:

MyModel.find(id, :select => 'every, attribute, except, the, blobs')

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

Полагаю, вы могли бы написать это так:

MyModel.find(id, :select => (MyModel.column_names - ['column_to_exclude']).join(', '))

Проверь это, прежде чем поверишь на мои слова. :)

1 голос
/ 22 октября 2009

Чистый подход, не требующий ИЗМЕНЕНИЙ в том, как вы кодируете в своем приложении, т. Е. Не вмешивайтесь в :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
...