Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:如何迭代用户是否已经对帖子发表了评论_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails RubyonRails:如何迭代用户是否已经对帖子发表了评论

Ruby on rails RubyonRails:如何迭代用户是否已经对帖子发表了评论,ruby-on-rails,ruby,Ruby On Rails,Ruby,这是我在stackoverflow的第一个问题,所以请耐心听我说,呵呵 我有三个模型:用户、帖子和评论 # user.rb class User < ApplicationRecord has_many :posts has_many :comments end # post.rb class Post < ApplicationRecord belongs_to :user has_many :comments end # comments.rb class C

这是我在stackoverflow的第一个问题,所以请耐心听我说,呵呵

我有三个模型:用户、帖子和评论

# user.rb
class User < ApplicationRecord
  has_many :posts
  has_many :comments
end

# post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_many :comments
end

# comments.rb
class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :post
end
#user.rb
类用户<应用程序记录
有很多帖子吗
有很多评论
结束
#post.rb
类Post
我试图实现的是让用户在帖子中只评论一次。如果同一用户已有注释,则该用户不应接受保存/创建

到目前为止,我的想法是创建一个模型函数,在其中迭代所有现有的post.comments.each,然后检查所有用户,如果有,则注释无效。虽然我不知道怎么做


如果您有任何想法(也许还有代码片段),请分享。提前感谢!:)

在你的
comment.rb中

validates :user_id, uniqueness: { scope: [:post_id]}

此验证将确保
用户id
发布id
的组合在您的
注释
表中是唯一的。

好吧,有几种方法可以做到这一点

首先,可以在
注释中验证用户id-发布id组合的唯一性

# app/models/comments.rb
class Comment < ActiveRecord::Base
  # ...
  validates_uniqueness_of :user_name, scope: :account_id
但在并发环境中,两种方法都可能失败。如果您的应用程序使用的是并发服务器,如或,您还需要一个数据库约束来防止创建重复记录。迁移过程如下:

add_index :comments, [:user_id, :post_id], unique: true

天哪,我不知道会这么容易。谢谢这对我是一个很大的帮助谢谢你!!我能再问你一个吗?如果我不想让用户对自己的帖子发表评论怎么办?我应该在代码中输入什么?蒂亚@roseann你想问多少就问多少,但你应该把它们作为单独的问题发布。天哪,谢谢!将在我的控制器中使用手动签入,而不是在模型中使用。我也不想让他们进入“新”表格,这样他们就看不见了。我可以再问你一个吗?如果我不想让用户对自己的帖子发表评论怎么办?我应该在代码中输入什么?蒂亚!在服务器端,您可以使用相同的方式检查具有给定Post\u id和user\u id的Post是否存在:
Post.exists?(user\u id:current\u user.id,id:params[:comment][:Post\u id])
这是为了防止用户在视图中通过curl或类似工具在客户端发布评论,我想您已经有@Post instance了。所以,如果
@post.user\u id==current\u user.id
add_index :comments, [:user_id, :post_id], unique: true