2011-06-16 3 views
4

J'ai une table entries avec un champ content qui peut contenir beaucoup de texte. Dans la plupart des cas, je n'ai pas besoin d'accéder à ce champ, il semble donc être une grosse perte de ressources pour charger chaque fois une énorme quantité de données inutilisées dans la base de données (sélectionnez * parmi les entrées où id = 1).Ruby on Rails: empêche de sélectionner une colonne par défaut

Comment est-ce que je pourrais spécifier le default_scope, que tous les champs excepté content seraient chargés de la base de données?

Répondre

11

En supposant Rails 3 et un schéma qui ressemble à ceci:

create_table "entries", :force => true do |t| 
    t.string "title" 
    t.text  "content" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

Vous pouvez utiliser la méthode select pour limiter les champs qui sont retournés comme ceci:

class Entry < ActiveRecord::Base 
    default_scope select([:id, :title]) 
end 

Dans la console rails, vous devriez voir quelque chose comme ceci:

puts Entry.where(:id => 1).to_sql # => SELECT id, title FROM "entries" WHERE "entries"."id" = 1 

Lorsque vous voulez sélectionner tous les champs, vous pouvez utiliser la méthode unscoped comme ceci:

puts Entry.unscoped.where(:id => 1).to_sql # => SELECT * FROM "entries" WHERE "entries"."id" = 1