2010-07-12 7 views
0

J'ai besoin d'un peu d'aide pour une requête AR. C'est ainsi que mes modèles ressemblent:Aide à la requête ActiveRecord

class User < AR:B 
    has_many :publications 
end 

class Publication < AR:B 
    belongs_to :user 
    belongs_to :category 
end 

class Category < AR:B 
    has_many :publications 
end 

Maintenant, disons que je veux itérer sur toutes catégories existantes et soit afficher les publications de l'utilisateur, ou afficher quelque chose comme « # {current_user.name} n'a pas publications cette catégorie ".

class PublicationsController < AC:B 

    def index 
    @categories = Category.find(:all, :include => :publications, :conditions => { 'publications.user_id' => current_user }) 
    end 

end 

Cela me donne toutes les catégories que l'utilisateur a réellement des publications, mais il manque les "vides".

Des suggestions? :-)

Répondre

0

Cela vous donne tous les objets Catégorie:

@categories = Category.all 

Ensuite, si vous déclarez has_many: à travers les associations que vous pouvez faire quelque chose comme ce qui suit:

@categories.each do |category| 
    if category.users.include?(current_user) 
    # User has publications 
    publications = category.publications.select { |pub| pub.user == current_user } 
    else 
    # User has no publications 
    end 
end 

(a-beaucoup déclarations -Grâce:

class User < AR:B 
    has_many :publications 
    has_many :categories, :through => :publication 
end 

class Publication < AR:B 
    belongs_to :user 
    belongs_to :category 
end 

class Category < AR:B 
    has_many :publications 
    has_many :users, :through => :publication 
end 

... avertissement: drycode)

Il existe probablement une façon plus simple de faire cela en utilisant des étendues nommées.

+0

Merci pour la réponse, mais comment accéder aux publications? @ category.publications donnerait quand même de moi toutes les publications de la catégorie ... – malloy

+0

A l'intérieur la déclaration if est les publications = ..., ça devrait vous donner les publications que l'utilisateur a dans la catégorie –

+0

Err .... thought this ' d be code du contrôleur:/Problème résolu, merci! – malloy

0

Vous pourriez être en mesure de modifier simplement l'appel trouver:

@categories = Category.find(:all, :include => :publications, :conditions => [ 'publications.user_id=? OR publications.user_id IS NULL', current_user ]) 

Notez que nous utilisons la variante Array ici plutôt que la variante de Hash, puisque l'exemple de la documentation, c'est l'utilisation correcte.

+0

Cela me donne toutes les catégories avec des publications, mais pas toutes les catégories. La condition publications.user_id IS NULL sera false par défaut, car il n'y a aucun enregistrement correspondant, ou ai-je oublié quelque chose? – malloy

+0

Je devrais essayer ou lire le code pour comprendre le SQL qui sort, en attendant ce qui suit peut fonctionner: @categories = Category.find (: all,: joins => "Publications LEFT JOIN ON publications.user_id = # {current_user.id} ") –