新帖子的Rails通知

时间:2012-09-07 10:30:44

标签: ruby-on-rails ruby-on-rails-3

我正在开发一个用户可以发布的rails应用程序,必须像facebook一样。我想实现一个通知系统,提醒用户注意新帖子。但是,我在如何判断用户是否查看了帖子方面遇到了麻烦。我真的很无能为力。

我正在使用devise gem,它允许我访问某些用户统计信息(如果这有帮助):

  create_table "users", :force => true do |t|
    t.string   "email",                  :default => "", :null => false
    t.string   "encrypted_password",     :default => "", :null => false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          :default => 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.string   "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string   "unconfirmed_email"
    t.integer  "failed_attempts",        :default => 0
    t.string   "unlock_token"
    t.datetime "locked_at"
    t.string   "authentication_token"
    t.datetime "created_at",                             :null => false
    t.datetime "updated_at",                             :null => false
    t.string   "username",               :default => "", :null => false
    t.integer  "admin",                  :default => 0
  end

我的帖子模型:

  create_table "posts", :force => true do |t|
    t.integer  "user_id"
    t.text     "content"
    t.datetime "created_at",                :null => false
    t.datetime "updated_at",                :null => false
  end

如何实现一个知道用户是否看过帖子的系统?

1 个答案:

答案 0 :(得分:3)

简单的方法就是这样:

创建一个名为 Seen

的模型
rails g model Seen post:references user:references

<强>模型/ seen.rb

belongs_to :user
belongs_to :post

<强>模型/ user.rb

has_many :seens
has_many :seen_posts, through: :seens, source: :post

<强>模型/ post.rb

has_many :seens
has_many :seen_users, through: :seens, source: :user

你可以创建类似的方法

<强>模型/ post.rb

def seen_by?(user)
  seen_user_ids.include?(user.id)
end

<强>控制器/ posts_controller.rb

def show
  @post = Post.find(params[:id])
  current_user.seen_posts << @post unless @post.seen_by?(current_user) 
end