Rails - 特殊验证案例

时间:2014-07-11 20:41:12

标签: ruby-on-rails validation

我正在构建一个Rails应用程序,我有以下实体:用户,地点和评论。我想允许每个用户只为一个地方添加一个评论。我想知道这个验证的最佳位置是什么 - 控制器还是模型?

这就是现在的样子:

评论(模特):

class Review < ActiveRecord::Base
  belongs_to :user
  belongs_to :place
  ...

地点(型号):

class Place < ActiveRecord::Base
  has_many :reviews
  ...

用户(型号):

class User < ActiveRecord::Base
  has_many :reviews
  ...

ReviewsController:

def create
  @place = Place.find(params[:place_id])

  existing_reviews_count = Review.where(:place_id => @place.id).where(:user_id => current_user.id).count
  if existing_reviews_count == 0
    review = @place.reviews.create(review_params)
    review.user = current_user
    review.save

  # OK
   else
  # BAD
  end

@reviews = Review.all
end

我认为将验证放在模型上会更好。我是对的吗?

1 个答案:

答案 0 :(得分:4)

尝试在审核中使用以下验证

class Review < ActiveRecord::Base
  belongs_to :user
  belongs_to :place
  validates :place_id, :uniqueness => {:scope => :user_id}
  ...

此外,您可以将具有唯一性的数据库索引约束在评论表中的user_id和place_id。