current_user只能查看他的帖子的评论

时间:2016-02-27 17:25:21

标签: ruby-on-rails ruby devise

我有什么:

scaffold Post title body user_id
scaffold Comment body tag post:references
post has_many :comments

当前评论控制器:

  def index
    @comments = Comment.where(tag: [1, 3])
  end

我想让当前设备用户只能查看他所有帖子的评论列表。怎么做到呢?有current_user的东西吗?

3 个答案:

答案 0 :(得分:4)

您可以直接在has_many :through模型上设置User关系,假设您已经定义了has_many :posts关系,并且在PostComment上建立了适当的关系。例如,

class User < ActiveRecord::Base
  has_many :posts
  has_many :comments, through: :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

现在,由于devise为您提供current_user,因此获得用户评论非常简单

def index
  @comments = current_user.comments
end

def show
  @comment = current_user.comments.find(params[:id])
end

希望这会有所帮助。欢呼声。

答案 1 :(得分:2)

如果您希望根据关联模型列中的信息建立查询,则应使用.joins.include来电。根据您指出的设置,这应该是您所需要的:

@comments = Comment.joins(:post).where("posts.user_id": current_user.id)

或者简单地说:

@comments = Comment.joins(:post).where("posts.user_id": current_user)

如果您打算在其他地方调用它,可能值得将其分解为Comment模型的范围。

class Comment < ActiveRecord::Base
  belongs_to :post
  scope :on_user_posts, ->(user) { joins(:post).where("posts.user_id": user) }

然后你可以在控制器中调用它:

@comments = Comment.on_user_posts(current_user)

如果需要,您还可以使用您已有的条件链接此范围:

@comments = Comment.on_user_posts(current_user).where(tag: [1, 3])

答案 2 :(得分:2)

在模型中定义关联和范围

class Comment < ActiveRecord::Base
    belongs_to :post
    scope :on_user_posts, lamda{ |user| joins(:post).where("posts.user_id = ?", user.id) }

你发布模特

class Post < ActiveRecord::Base
  has_many :comments

现在调用此范围

@comments = Comment.on_user_posts(current_user).where(tag: [1, 3])