Поиск полиморфных ассоциаций в Rails - PullRequest
3 голосов
/ 20 октября 2010

Мне нужно, чтобы в моем приложении пользователи могли добавлять записи в закладки. Они должны иметь возможность создавать только одну закладку на пост. Я настроил свою полиморфную ассоциацию так:

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)

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

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

Спасибо.

1 Ответ

2 голосов
/ 20 октября 2010

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

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

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

...