2010-10-19 5 views
3

J'ai un besoin dans mon application pour permettre aux utilisateurs de mettre en signet un message. Ils ne devraient être en mesure de créer un signet par publication. J'ai mis en place mon association polymorphique comme suit:Recherche d'associations polymorphes dans Rails

class Post < ActiveRecord::Base 
    has_many :bookmarks, :as => :bookmarkable 
end 

class Bookmark < ActiveRecord::Base 
    belongs_to :bookmarkable, :polymorphic => true 
    belongs_to :user 
end 

class User < ActiveRecord:Base 
    has_many :posts 
    has_many :bookmarks 
end 

À mon avis, un utilisateur peut créer un signet. Je voudrais trouver un moyen de remplacer le code de vue "Créer un signet" par le code "Supprimer le signet", si l'utilisateur a déjà mis en signet un article particulier.

Si j'essaie de faire quelque chose comme ceci:

@post = Post.find(params[:id, :include => [:bookmarks]]) 
- if @post.bookmarks.users.include?(@user) 

J'obtiens une erreur Méthode Non pour « utilisateurs »

Comment puis-je accéder à des propriétaires des signets, pour déterminer si l'utilisateur a déjà mis en signet une page?

Merci.

Répondre

2

J'approche cela du point de vue de l'utilisateur:

class User < ActiveRecord::Base 
    has_many :posts 
    has_many :bookmarks 

    # Rails 3 
    def bookmarked?(post) 
    bookmarks.where(
     { 
     :bookmarkable_id => post.id, :bookmarkable_type => post.class.name 
     } 
    ).count > 0 
    end 

    # Rails 2 
    def bookmarked?(post) 
    bookmarks.find(:all, :conditions => 
     { 
     :bookmarkable_id => post.id, :bookmarkable_type => post.class.name 
     } 
    ).count > 0 
    end 
end 

if @user.bookmarked?(@post) 
    # Show delete link 
else 
    # Show bookmark link 
end 

Je voudrais également vous conseiller d'ajouter une validation à votre modèle de signets qui empêche un utilisateur de bookmarking le même poste deux fois.