如何改进rails中更新多个属性的rails代码

Posted

技术标签:

【中文标题】如何改进rails中更新多个属性的rails代码【英文标题】:how to improve the rails code of update multiple attributes in 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

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

请帮助改进代码。

提前致谢

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何改进rails中更新多个属性的rails代码的主要内容,如果未能解决你的问题,请参考以下文章

如何改进 Ruby on Rails 视图中的代码

如何在视图中设置和调用 rails 方法来更新对象的属性

如何仅更新 rails 6 中 current_user 的嵌套表单属性?

通过复选框Rails 4添加多个嵌套属性(可能有多种形式)

如何使用flex在Rails上提交多个模型?

Rails - 有没有办法更新单个属性?