在Rails中搜索多态关联

时间:2010-10-19 23:05:48

标签: ruby-on-rails polymorphic-associations

我的应用中需要允许用户为帖子添加书签。他们应该只能为每个帖子创建一个书签。我已经建立了我的多态关联:

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 个答案:

答案 0 :(得分:2)

我会从用户的角度来看待这个问题:

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

我还建议您为书签模型添加一个验证,以防止用户将同一帖子加入书签两次。