覆盖模型的create方法
Posted
技术标签:
【中文标题】覆盖模型的create方法【英文标题】:overwrite the create method of the model 【发布时间】:2021-12-14 22:50:58 【问题描述】:我使用cocoon gem进行嵌套记录,由于表单将通过ajax提交,提交数据后必须保留在表单中进行创建,我需要修改嵌套记录模型的create方法,因为每次表单的保存与用户之前保存表单时创建的记录相同。
是否可以覆盖模型的 create 方法,以便在保存记录时首先查找记录是否存在,如果存在则更新记录?
我做过这样的事情:
class PayrollEmployee < ApplicationRecord
belongs_to :payroll
belongs_to :employee_contract
def create_or_update
payroll_employee = PayrollEmployee.find_by_payroll_id_and_employee_contract_id(payroll_id, employee_contract_id) || PayrollEmployee.new()
payroll_employee.update_attributes!(:payroll_id => payroll_id, :employee_contract_id => employee_contract_id) #etc etc
end
end
但我收到此错误:
ArgumentError (wrong number of arguments (given 1, expected 0)):
app/models/payroll_employee.rb:6:in `create_or_update'
app/controllers/payrolls_controller.rb:122:in `block in update'
app/controllers/payrolls_controller.rb:121:in `update'
【问题讨论】:
为什么不直接使用 ajax/xhr 重新渲染表单,以便后续保存将转到正确的update
操作?或者,如果这对您来说太多或太慢,只需相应地调整表单的 url?
@nathanvda 这是个好主意,我试过了,它可以工作,但是当有很多嵌套记录时,添加新的嵌套记录会变得很慢,因为它总是加载整个表单。有没有办法只加载茧部分的最后一个嵌套记录而不重新加载所有内容?
【参考方案1】:
PayrollEmployee
模型上的 create_or_update
方法不接受任何参数,我猜在工资单控制器上你已经传递了一个参数。这就是为什么它给出这个ArgumentError (wrong number of arguments (given 1, expected 0)):
错误
所以你应该在你定义的create_or_update
方法中添加一个参数,或者你应该从控制器中的方法中删除传递的值。
【讨论】:
以上是关于覆盖模型的create方法的主要内容,如果未能解决你的问题,请参考以下文章
我有嵌套的序列化程序,并希望通过覆盖create方法为其创建一个实例。
Django 模型方法 - create_or_update