我有什么:
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
的东西吗?
答案 0 :(得分:4)
您可以直接在has_many :through
模型上设置User
关系,假设您已经定义了has_many :posts
关系,并且在Post
和Comment
上建立了适当的关系。例如,
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])