如何为帖子建立标记系统?

时间:2013-12-24 07:09:48

标签: ruby-on-rails devise ruby-on-rails-3.1

我一直在努力找出在rails 3.1中构建用户标记系统的最佳方法。我尝试了make_flaggable宝石,但它没有给我我需要的东西。

我正在为我的用户模型使用设计,我有一个属于用户的Post模型。我需要能够检索从站点管理员端标记的所有帖子的列表。到目前为止,我很难获得。

我不确定在Flag模型和Post / User模型之间需要使用哪种类型的关系。我一直在阅读多态关系,这看起来很有希望。

非常感谢任何想法或反馈!

2 个答案:

答案 0 :(得分:6)

推出自己的解决方案非常容易。我会这样做。

class User 
  has_many :flags
end
class Post 
  has_many :flags
end
class Flag
  belongs_to :user
  belongs_to :post
end

您可以通过浏览标记模型或帖子模型来获取已标记的帖子。

# since a post has many flags
# you will get duplicates for posts flagged more than once
# unless you call uniq
flagged_posts = Post.joins(:flags).uniq

或通过标志模型:

flags = Flag.includes(:post).uniq
flags.each do |flag|
  puts flag.post
end

为确保您不会从同一用户的同一帖子上获得重复标记,我会在迁移中添加uniq索引:

  def change
    create_table :flags do |t|
      t.belongs_to :user, null: false
      t.belongs_to :post, null: false
      t.timestamps
    end
    add_index :flags, [:user_id, :post_id], unique: true
  end

答案 1 :(得分:1)

也许我误解了你要做的事情,但为什么不在你的帖子表中添加一个名为“已标记?”的列。然后你可以做User.posts(:where =>:flagged => true)。