使用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
但是,如果用户已经对该人进行了投票,则上述操作无效。在这种情况下,我想删除他们之前的投票并创建新投票(或编辑现有投票)。是否有一种简单的方法可以根据是否存在唯一约束来进行事务性插入/更新?
答案 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
它会查找当前Vote
和User
的{{1}},如果它存在,它将Person
,如果不存在,它将创建它。
(它只会生成一个Update
)