【问题标题】:how to improve the rails code of update multiple attributes in rails如何改进rails中更新多个属性的rails代码
【发布时间】:2022-01-18 08:03:23
【问题描述】:

我需要更新 rails 中表的许多属性的值。我为此使用内联编辑。请查看下面的代码,并给我建议以更好的方式改进代码(模块化,元编程......)。

products_controller.rb

def update
  @page=params[:page] # In normal update no such param, so initialized with nil. If inline edit, that will be "inline"     
  @page=="inline"? inline_update: update_by_app_params    
end


#Method to update by inline Update of individual params
def inline_update    
  if inline_edit_param_contains_description?
     status = Product.update_description(params,current_user.id,@product)
  elsif inline_edit_param_contains_order_number?
     status = Product.update_order_number(params,current_user.id,@product)            
  elsif inline_edit_param_contains_date?
     status = Product.update_end_date(params,current_user.id,@product)
  ..........................
  ..........................
  end      
  (status==true)? respond_block : rescue_block 
end


def respond_block
  respond_to do |format|         
    format.json { render json: {status: true, description: @product.description} } if inline_edit_param_contains_description?
    format.json { render json: {status: true, order_number: @product.order_number} } if inline_edit_param_contains_order_number?
    ...........................
    ...........................
end

def rescue_block    
  flash.now[:error] = @product.errors.full_messages.uniq.join(', ')    
  respond_to do |format|
    format.json { respond_with_bip(@product) }      
  end
end


 #Method to check description in inline edit
def inline_edit_param_contains_description?    
  params[:product][:description]
end

#Method to check order number in inline edit
def inline_edit_param_contains_order_number?    
  params[:product][:order_number]
end

..............
..............


 

product.rb

#This method will update the description of product
def self.update_description params,user_id,product    
  product.order=product.request_no   
  status = product.update(:description=>params[:product][:description],:last_modified_by=>user_id)
  ProductHistory.update_history product, 'updated' if(status==true)   
  status
 end


#This method will update the order_number of product
def self.update_order_number params,user_id,product    
  product.order=product.request_no   
  status = product.update(:order_number=>params[:product][:order_number],:last_modified_by=>user_id)
  ProductHistory.update_history product, 'updated' if(status==true)   
  status
 end

.................
.................

请帮助改进代码。

提前致谢

【问题讨论】:

    标签: ruby-on-rails ruby module metaprogramming ruby-on-rails-6


    【解决方案1】:

    我认为你可以按照标准的 CRUD 操作:@product.update(product_params)。 Rails 足够聪明,可以理解只有一个属性发生了变化,并且会相应地调整其UPDATE 语句。

    如果您愿意,可以在服务器日志中检查。

    然后,我的建议是使用 changed_attributes 选项传回更改的字段并处理整个 JSON 对象客户端(因为它只包含更改的值,您可以全部处理它们):

    class ProductController < ApplicationController
      ...
    
      def update
        product.update(product_params)
    
        respond_to do |format|
          format.json { render json: product.changed_attributes }
        end
      end
    
      private
    
      def product
        @product ||= current_user.products.find(params[:id])
      end
    
      def product_params
        params.require(:product).permit(:name, :description, :order_number, ...)
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多