我有一个讨论论坛,用户可以在其中查看未读帖子的列表。我这样做的方法是使用Look,User和Post模型:
class Look < ActiveRecord::Base
belongs_to :post
belongs_to :user
end
class User < ActiveRecord::Base
has_many :posts, through: :looks
has_many :looks
end
class Post < ActiveRecord::Base
belongs_to :user
has_many :looks
has_many :users, through: :looks
end
所以它的工作方式是有一个用户查看过的所有帖子ID的列表。它是通过&#39; show&#39;创建的。方法:
def show
if current_user
viewer = current_user
view_ids = viewer.posts.pluck(:id).uniq
not_viewed = Post.where("id not in (?)", view_ids)
not_viewed_ids = not_viewed.pluck(:id)
unless Post.find(params[:id]).in?(not_viewed_ids)
Look.create(user: current_user, post: @post, viewstamp: Time.now)
end
end
end
到目前为止一切正常。问题是我想为所有帖子创建一个Look,以便我可以基本上将所有帖子标记为已读“。此行适用于为当前帖子创建Look:
unless Post.find(params[:id]).in?(not_viewed_ids)
Look.create(user: current_user, post: @post, viewstamp: Time.now)
end
...但是如何创建一个为每个帖子创建一个Look ?像这样:
Look.create(user: current_user, post: [NEED ARRAY OF POSTS HERE], viewstamp: Time.now)
我想这样做的原因是用户可以将所有帖子标记为已读。
答案 0 :(得分:1)
只需将用户添加到帖子中即可自动创建Look。
Post.all.each { |p| p.users << current_user; p.save }