2008-09-18 5 views

ответ

4

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

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

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

Я думаю, вы могли бы написать это следующим образом:

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

испытания эти, прежде чем принять мое слово, хотя. :) Ответ

+0

Исправлено второе предположение, согласно наблюдению Зеке. Спасибо @Zeke. – 2015-01-04 20:25:58

4

FD является в основном правильно, но ActiveRecord doesn't currently accept an array как: выберите аргумент, так что вам нужно, чтобы присоединиться желательные столбцы в строку с разделителями запятыми, например, так:

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

Чистый подход не требует каких-либо изменений, как вы закодировать еще где в вашем приложении, т.е. не баловаться с :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 
12

Я просто побежал в это с помощью рельса 3.

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

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

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

+1

Привет, Криш. Я создал плагин [Rails, основанный на вашей идее с именем `lazy_columns`] (https://github.com/jorgemanrubia/lazy_columns). Благодаря! – jmanrubia 2013-01-13 09:01:29