2010-09-09 1 views

Répondre

2

Ceci est plus un problème de SQL que ActiveRecord. Ce dont vous avez besoin est de rejoindre les 2 tables mais sélectionnez celles qui ne sont pas référencées dans la table de jointure.

Page.first(:include => :groups, :conditions => ["`#{Group.table_name}`.id IS NULL"] 
# The opposite query would be 
Page.first(:include => :groups, :conditions => ["`#{Group.table_name}`.id IS NOT NULL"] 
# Note that this slightly different than just: 
Page.first(:include => :groups) 
# This produces a IN query, rather than join. 

également :joins ne fonctionne pas parce qu'il crée un INNER JOIN, par opposition à OUTER JOIN qui est nécessaire dans ce cas.

+0

YES c'est encore mieux! (J'ai résolu le problème avec la boucle à travers toutes les pages .. pas vraiment efficace;)) .. merci ...: D – heldopslippers

2

Une solution pourrait être d'ajouter un counter_cache pour les groupes.

Dans Group.rb

belongs_to :page, :counter_cache => true 

Ensuite, vous devez créer une migration

def self.up 
    add_column :pages, :groups_count, :integer, :default => 0 

    Page.reset_column_information 
    Page.find(:all).each do |p| 
    Page.update_counters p.id, :groups_count => p.groups.length 
    end 
end 

def self.down 
    remove_column :pages, :groups_count 
end 

Donc, maintenant vous pouvez faire:

Page.first(:conditions => { :groups_count => 0 }) 
+0

Ok oui cela fonctionnerait. MAIS je n'aime pas vraiment que je devrais créer une autre migration pour cette simple déclaration. :(Ensuite, je pouvais juste le faire avec sql .. Mais thanxs! – heldopslippers

0

Quelque chose comme:

Page.find(:all, 
      :select => "pages.*, count(groups.page_id) group_count", 
      :joins => :groups, 
      :group => "pages.id having group_count = 0) 
Questions connexes