Поиск полиморфных ассоциаций в 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

На мой взгляд, пользователь может создать закладку. Я хотел бы найти способ заменить код просмотра «Создать закладку» кодом «Удалить закладку», если пользователь уже добавил в закладки определенный пост.

Если я попытаюсь сделать что-то вроде этого:

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

Я получаю ошибку «Нет метода» для «пользователей».

Как я могу получить доступ к владельцам закладок, чтобы определить, добавил ли текущий пользователь страницу в закладки?

Спасибо.


person Kevin Whitaker    schedule 19.10.2010    source источник


Ответы (1)


Я бы подошел к этому с точки зрения пользователя:

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

Я бы также посоветовал вам добавить проверку в вашу модель закладок, которая не позволит пользователю добавить в закладки один и тот же пост дважды.

person Mischa    schedule 20.10.2010