2009-04-27 10 views
0

Pour mon modèle Vendeur:Comment puis-je vérifier si un 'Review' a déjà été écrit par un @current_user donné?

:has_many Review 

et chaque utilisateur:

:has_many Review 

et chaque examen:

:belongs_to Vendor 
:belongs_to User 

So. Je ne suis pas un utilisateur pour être en mesure d'écrire plus d'une revue, donc je veux faire une vérification sur les vendeurs /: l'URL vendorId qui est l'action "show", et avoir un moyen de faire la "Write Review" Le bouton disparaît ou apparaît en fonction du fait que l'utilisateur @current_user a déjà écrit un avis pour ce fournisseur spécifique.

Je connais le @ vendor.id et @ loggedin_user.id mais je ne sais pas comment faire une recherche sur deux paramètres.

Répondre

4

Il existe de nombreuses façons de procéder. Si vous voulez juste trouver sur deux paramètres, vous pouvez faire:

Review.find(:first, :conditions => {:user_id => @user.id, :vendor_id => @vendor.id}) 

Vous pouvez également utiliser des associations, comme ce qui suit:

@current_user.reviews.find(:first, :conditions => {:vendor => @vendor}) 

Un named_scope serait une autre façon:

class Review < ActiveRecord::Base 
    named_scope :for_vendor, lambda {|vendor| 
    {:conditions => {:vendor => vendor}} 
    } 
    belongs_to :vendor 
    belongs_to :user 
end 

@current_user.reviews.for_vendor(@vendor).empty? 

comme il est une règle d'affaires, je recommande encapsulant cette logique dans une méthode de chaque utilisateur ou fournisseur, comme:

def can_review?(vendor) 
    self.reviews.find(:first, :conditions => {:vendor => @vendor}).nil? 
end 

Vous pouvez ensuite faire, dans la vue:

<%= review_vendor_button if @current_user.can_review?(@vendor) %> 
+0

c'était bon, merci! – Angela

Questions connexes