如何改进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代码的主要内容,如果未能解决你的问题,请参考以下文章