2013-10-13 3 views
0

Я пытаюсь реализовать некоторую уникальность в моей базе данных с возможностью замены текущего значения, если оно уже находится в базе данных.Как реализовать запись if есть перезаписать базу данных рельсов

Моя таблица выглядит

t.integer "task_id" 
t.integer "accessor_id" 
t.integer "access_owner" 
t.boolean "access_rights" 

и я хочу, чтобы проверить, что если есть запись с TASK_ID, accessor_id и access_owner, чем обновление access_right, и если есть не один создать такую ​​запись

мой текущий метод создания и новый метод является

class AccessorsController < ApplicationController 
def new 
     @accessor = Accessor.new 
     @task_id = params[:task_id] 
    end 


    def create 
    @accessor = Accessor.new(accessor_params) 
    @user = User.where(email: params[:accessor][:accessor_id]).first 
    @accessor.accessor_id = @user.id  
    @accessor.access_owner = current_user.id 
    respond_to do |format| 
     if @accessor.save 
     format.html { redirect_to Task, notice: 'User was successfully created.' } # 
     format.json { render action: 'show', status: :created, location: Task }# 
     else 
     format.html { render action: 'new' } # 
     format.json { render json: @accessor.errors, status: :unprocessable_entity }# 
     end 
    end 
    end 

Я попытался сделать следующее

@accessor = Accessor.where("access_owner = ? AND accessor_id = ? AND task_id = ?", current_user.id, User.where(email: params[:accessor][:accessor_id]).first,params[:task_id]).first || Accessor.new(accessor_params) 

, но это не сработало

ответ

1

Вы можете использовать find_or_initialize_by.. методы:

@accessor = Accessor.find_or_initialize_by_task_id_and_accessor_id_and_access_owner(params[:task_id], params[:accessor_id], params[:access_owner]) 

@accessor.update_attributes(
    :access_rights => params[:access_rights] 
) 
+0

будет ли это быть добавлены до сохранения? или он заменит некоторые из моих методов? – Quantico

+0

См. Мое редактирование – Quantico

+0

update_attributes сохраняет запись. Вы можете просто установить атрибут сначала, а затем сохранить его. \ @ accessor.access_rights = params [: access_rights] \ @ accessor.save Я обновлю свой ответ с помощью метода создания, который у вас будет. – iouri

Смежные вопросы