2008-09-18 10 views

Respuesta

4

Creo que se puede pedir a AR para cargar columnas específicas en su invocación de encontrar:

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

Sin embargo, esto tendría que ser actualizado a medida que agrega columnas, así que no es ideal. No creo que exista ninguna forma de excluir específicamente una columna en rieles (ni en una sola selección de SQL).

Creo que se puede escribir así:

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

Prueba de esto antes de que tome mi palabra para ella sin embargo. :) respuesta

+0

Se corrigió la segunda sugerencia, según la observación de Zeke. Gracias @Zeke. –

4

de fd es sobre todo la derecha, pero ActiveRecord doesn't currently accept an array como: seleccione argumento, por lo que necesita para unirse a las columnas deseadas en una cadena delimitada por comas, así:

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

Una limpia enfoque no requiere cambios en la forma de codificar en otra parte de su aplicación, es decir, sin ensuciar con :select opciones

Por alguna razón que necesita o decide almacenar manchas en las bases de datos. Sin embargo, no desea mezclar columnas de blobs en la misma tabla que sus atributos regulares . BinaryColumnTable le ayuda a almacenar TODOS los blobs en en una tabla separada, administrada de forma transparente por un modelo ActiveRecord. Opcionalmente, le ayuda a registrar el tipo de contenido del blob.

http://github.com/choonkeat/binary_column_table

uso es simple

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

Me acabo de encontrar con esta utilización del ferrocarril 3.

Afortunadamente no fue tan difícil de resolver. Configuré un default_scope que eliminaba las columnas particulares que no quería del resultado. Por ejemplo, en el modelo que tenía había un campo de texto xml que podía ser bastante largo y no se usaba en la mayoría de las vistas.

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

Usted verá a partir de la solución que tenía que asignar a las columnas completamente versiones aprobadas por lo que podrían seguir utilizando el modelo a través de las relaciones y sin ambigüedades de atributos. Más adelante, cuando quieras tener el campo, simplemente pega otro .select(:data) para tenerlo incluido.

+1

Hola Crish. Creé un [complemento Rails basado en tu idea llamado 'lazy_columns'] (https://github.com/jorgemanrubia/lazy_columns). ¡Gracias! – jmanrubia

+0

Tenga en cuenta que esto no funciona al usar la opción: include – Christian

+0

FYI, vi esto en mi consola después de usar esto: ADVERTENCIA DE DEPRESIÓN: la llamada a #default_scope sin un bloque está en desuso. Por ejemplo, en lugar de 'default_scope donde (color: 'red')', usa 'default_scope {where (color: 'red')}'. (Alternativamente puede simplemente redefinir self.default_scope) –

Cuestiones relacionadas