3 Stimmen

Suche nach polymorphen Assoziationen in Rails

Ich muss in meiner Anwendung den Benutzern die Möglichkeit geben, einen Beitrag mit einem Lesezeichen zu versehen. Sie sollten nur ein Lesezeichen pro Beitrag erstellen können. Ich habe meine polymorphe Assoziation wie folgt eingerichtet:

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

Meiner Meinung nach kann ein Benutzer ein Lesezeichen anlegen. Ich möchte eine Möglichkeit finden, den Code der Ansicht "Lesezeichen erstellen" durch den Code "Lesezeichen löschen" zu ersetzen, wenn der Benutzer bereits ein Lesezeichen für einen bestimmten Beitrag erstellt hat.

Wenn ich versuche, so etwas zu tun:

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

Ich erhalte die Fehlermeldung No Method für "users".

Wie kann ich auf die Besitzer der Lesezeichen zugreifen, um festzustellen, ob der aktuelle Benutzer bereits ein Lesezeichen für eine Seite gesetzt hat?

Ich danke Ihnen.

2voto

Mischa Punkte 42276

Ich würde dies aus der Sicht des Nutzers betrachten:

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

Ich würde Ihnen auch raten, eine Validierung zu Ihrem Lesezeichenmodell hinzuzufügen, die verhindert, dass ein Benutzer denselben Beitrag zweimal mit einem Lesezeichen versieht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X