是否有一种直接的方法来替换基于唯一约束的模型?

时间:2018-01-16 22:56:16

标签: ruby-on-rails replace save ruby-on-rails-5 unique

使用Rails 5,基于模型中的唯一性约束编写替换保存方法的最优雅方法是什么?这是我的模型,其中两列定义了唯一约束

class Vote < ApplicationRecord
  belongs_to :person
  belongs_to :user

  validates_uniqueness_of :person, scope: [:user]
end

在我的控制器中,我想通过

调用逻辑来保存投票
  # Rate someone!
  def create
    user = current_user
    @vote = Vote.new(vote_params)
    @vote.user = user
    @vote.save!
  end

但是,如果用户已经对该人进行了投票,则上述操作无效。在这种情况下,我想删除他们之前的投票并创建新投票(或编辑现有投票)。是否有一种简单的方法可以根据是否存在唯一约束来进行事务性插入/更新?

2 个答案:

答案 0 :(得分:0)

您应该使用find_or_create_by

# Rate someone!
def create
  @vote = Vote.find_or_create_by(person_id: vote_params[:person_id])
  @vote.user = current_user
  @vote.save!
end

答案 1 :(得分:0)

我会选择first_or_create

def create
  @vote = Vote.where(person_id: vote_params[:person_id], user: current_user).first_or_create.update(vote_params)
end

它会查找当前VoteUser的{​​{1}},如果它存在,它将Person,如果不存在,它将创建它。

(它只会生成一个Update