2016-06-13 2 views
0

나는 4 가지 모델을 가지고 있으며, 모든 모델을 업데이트하는 매우 중요한 이유가있다. (가능하다면 별도의 액션이 있지만 액션은 1 개). 내가 한 모델을 업데이트하려면단일 액션으로 여러 모델을 업데이트하는 방법은 무엇입니까? (레일즈 4)

나는 적절한 PARAMS와

def update 
    @modelA = ModelA.find(params[:id] 
    respond_to do |format| 
     if @modelA.update(modelA_params) 
     format.html { redirect_to :back, notice: "" } 
     format.json { head :no_content } 
     else 
     format.json { render json: @modelA.errors, status: :unprocessable_entity } 
     format.html { render :show } 
     end 
    end 
end 

를 사용할 수 있습니다. 구성 페이지가 있고 4 개의 모델을 업데이트하려면 어떻게해야합니까? 각 모델에 대해 4 개의 열이 있고 각 열을 모델에서 적절한 특성으로 업데이트하려고합니다. 필자의 경우에는 x-editable gem을 사용하여 속성을 업데이트하고 있습니다.

질문은 ... 해킹이 있습니까? 경우 조건에 일괄 업데이트와 같은 또는 내가 에 대한 모든 모델에 대한 업데이트 작업을 만들어야을 업데이트?

+0

당신이 할 수있는을 같은 형식으로 다른 모델에 속하는 다른 매개 변수를 수집하십시오. 그리고 하나의 컨트롤러 동작 (#create 또는 #update) 내에서 4 가지 모델을 업데이트하십시오. 그것은 특별한 해킹이 아니며 컨트롤러에서 모든 모델의 레코드를 호출하는 기능입니다. 중첩 된 양식을 사용할 수 있습니다. 또는 아무런 문제없이 수집 한 다음 컨트롤러 작업 내에서 수동으로 할당하십시오. – Maxence

+0

이러한 모델이 관련되어 있는지 여부에 따라 [중첩 된 특성] (http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html)을 사용할 수 있습니다. –

답변

2

(configuration_controller에) 당신이 작업에 대한 모든 4 개 모델의 매개 변수를 전달할 수 있다면, 당신이 좋아하는 뭔가를 할 수 : 당신이 행동 atomicity을 할 수 있습니다로

# app/controllers/configuration_controller.rb 
def update 
    @a = ModelA.find(params[:model_a][:id]) 
    @b = ModelB.find(params[:model_b][:id]) 
    @c = ModelC.find(params[:model_c][:id]) 
    @d = ModelD.find(params[:model_d][:id]) 

    @a.assign_attributes(model_a_params) 
    @b.assign_attributes(model_b_params) 
    @c.assign_attributes(model_c_params) 
    @d.assign_attributes(model_d_params) 

    respond_to do |format| 
    if @a.save && @b.save && @c.save && @d.save 
     format.html { redirect_to :back, notice: "" } 
     format.json { head :no_content } 
    else 
     format.json { render json: [@a.errors, @b.errors, @c.errors, @d.errors], status: :unprocessable_entity } 
     format.html { render :show } 
    end 
    end 

    private 

    def model_a_params 
    params.require(:model_a).permit(:id) # and other permitted params 
end 

#... same for the other 3 models 

나는 여기 assign_attributes을 사용했다.

[편집] 다른 한편으로는, 당신은 별도의 행동의 모델을 업데이트하려면, 경우

는, 단순히 컨트롤러에 4 개 별도의 조치가 : 물론

# app/controllers/configuration_controller.rb 
def update_model_a 
    @a = ModelA.find(params[:id]) 
    respond_to do |format| 
    if @a.save 
     format.html { redirect_to :back, notice: "" } 
     format.json { head :no_content } 
    else 
     format.json { render json: [@a.errors, @b.errors, @c.errors, @d.errors], status: :unprocessable_entity } 
     format.html { render :show } 
    end 
    end 

    def update_model_b 
    @b = ModelB.find(params[:id]) 
    respond_to do |format| 
     if @b.save 
     format.html { redirect_to :back, notice: "" } 
     format.json { head :no_content } 
     else 
     format.json { render json: [@a.errors, @b.errors, @c.errors, @d.errors], status: :unprocessable_entity } 
     format.html { render :show } 
     end 
    end 

# ... etc. 

private 

def model_a_params 
    params.require(:model_a).permit(:id) # and other permitted params 
end 

def model_b_params 
    params.require(:model_b).permit(:id) # and other permitted params 
end 

# ... etc. 

#... same for the other 3 models 
+0

흠 당신의 솔루션은 흥미 롭습니다 ...하지만 구현하려고하고 거기에 몇 가지 문제를 발견 ... 나는 x 편집 가능한 모델에서 1 속성을 받아 당신에게 업데이 트를 요청 컨트롤러에 전화를 잊어 버렸습니다. ModelA에서 attributute를 업데이트하고 싶습니다. "modelB obiect : id, modelC obiect : id 등등을 찾지 못했습니다. 그래서 모든 모델에서"전체 가방을 선택하십시오. "하지만 단일 속성을 취하는 작업을하고 싶습니다. 적절한 모델에서 – Skrypter

+0

및 binding.pry에서 내 응답을 업데이트 할 때 : [1] pry (# )> params => { "modelA"=> { "name"=> " – Skrypter

+1

질문을 오해 한 경우 죄송합니다. 귀하가 갖고있는 보석에 대해서도 익숙하지 않습니다. 위의 매개 변수에서'action'을로 바꿀 수 있다면, s ay'update_model_a'를 사용하면 개별 모델마다 하나의 호출을 수행 할 수 있습니다. 따라서 각 모델에 대해 하나씩,'ConfigurationsController'에서 4 개의 update 액션이 필요합니다. –

관련 문제