2009-12-10 4 views
1

J'ai les relations suivantes dans mon modèle:Mettre une condition sur un grand nombre à plusieurs requêtes avec ActiveRecord

class Show < ActiveRecord::Base 
    has_many :service_shows 
    has_many :services, :through => :service_shows 
end 

class Service < ActiveRecord::Base 
    has_many :service_shows 
    has_many :shows, :through => :service_shows 
end 

class ServiceShow < ActiveRecord::Base 
    belongs_to :show 
    belongs_to :service 
end 

je voudrais interroger en arrière toutes les émissions pour un service donné qui ont un rec_status = 'A', mais mes compétences ActiveRecord ont seulement trois jours, donc je n'ai pas vraiment les côtelettes. Si je comprends bien, je pourrais simplement appeler service.shows et filtrer la liste retournée, mais je voudrais seulement récupérer les enregistrements dont j'ai besoin de la base de données - je préfère ne pas gaspiller le temps de processeur et la mémoire sur les disques que je ne Je veux.

Merci!

Répondre

6

D'après votre description, il semble que des spectacles ont la colonne :rec_status. Sur cette base, je mis en place certaines données de l'échantillon:

Show.create!(:name => 'One', :rec_status => 'A') 
Show.create!(:name => 'Two', :rec_status => 'B') 

Service.create!(:name => 'Service One') 
Service.create!(:name => 'Service Two') 

Show.first.services = Service.all 
Show.last.services = Service.all 

Étant donné un seul service, vous pouvez, comme vous le mentionnez, revenir tous les spectacles:

service = Service.first 
service.shows 

Si vous souhaitez sélectionner un sous-ensemble de dossiers, vous pouvez étendre la chaîne avec un appel finder:

service.shows.all(:conditions => {:rec_status => 'A'}) 

Mieux encore, vous pouvez saisir cela comme un champ nommé sur le modèle Afficher:

class Show < ActiveRecord::Base 
    has_many :service_shows 
    has_many :services, :through => :service_shows 

    named_scope :for_status, lambda {|status_flag| {:conditions => {:rec_status => status_flag}} } 
end 

Et puis l'utiliser au lieu de passer le hachage :conditions:

service.shows.for_status('A') 
Questions connexes