2008-09-18 8 views

Répondre

4

Je crois que vous pouvez demander AR charger des colonnes spécifiques dans votre appel pour trouver:

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

Cependant, il devrait être mis à jour que vous ajoutez des colonnes, il est donc pas idéal. Je ne pense pas qu'il existe un moyen d'exclure spécifiquement une colonne dans les rails (ni dans une seule sélection SQL).

Je suppose que vous pouvez l'écrire comme ceci:

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

Tester ces avant de prendre ma parole bien. :) La réponse de

+0

Correction de la deuxième suggestion, selon l'observation de Zeke. Merci @Zeke. –

4

fd est le plus souvent droit, mais ActiveRecord doesn't currently accept an array comme: l'argument de sélection, de sorte que vous devrez joindre les colonnes souhaitées dans une chaîne délimitée par des virgules, comme ceci:

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

Un environnement propre approche nécessitant aucune modification de la façon dont vous le code d'autre où dans votre application, à savoir pas déconner avec les options :select

pour quelque raison que ce dont vous avez besoin ou choisir de blobs stocker dans des bases de données. Cependant, vous ne souhaitez pas mélanger des colonnes blob dans la même table que vos attributs habituels . BinaryColumnTable vous aide à stocker TOUS les blobs dans une table distincte, gérée de manière transparente par un modèle ActiveRecord. En option, il vous aide à enregistrer le type de contenu du blob.

http://github.com/choonkeat/binary_column_table

utilisation est 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

Je viens de rencontrer dans ce rail en utilisant 3.

Heureusement, il n'a pas été si difficile à résoudre. J'ai mis un default_scope qui a enlevé les colonnes particulières que je ne voulais pas du résultat. Par exemple, dans le modèle que j'avais, il y avait un champ de texte xml qui pouvait être assez long et qui n'était pas utilisé dans la plupart des vues.

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

Vous verrez de la solution que je devais cartographier les colonnes à des versions entièrement qualifiées je pourrais continuer ainsi d'utiliser le modèle grâce à des relations sans ambiguïtés dans les attributs. Plus tard, lorsque vous voulez avoir le champ juste virer sur un autre .select(:data) pour l'avoir inclus.

+1

Salut Crish. J'ai créé un plugin [Rails basé sur votre idée nommée 'lazy_columns'] (https://github.com/jorgemanrubia/lazy_columns). Merci! – jmanrubia

+0

Notez que cela ne fonctionne pas lorsque vous utilisez l'option: include – Christian

+0

FYI, vu ceci sur ma console après avoir utilisé ceci: DEPRECATION AVERTISSEMENT: Appeler #default_scope sans un bloc est obsolète. Par exemple, au lieu de 'default_scope où (color: 'red')', veuillez utiliser 'default_scope {where (couleur: 'red')}'. (Vous pouvez également redéfinir self.default_scope.) –

Questions connexes