我有三个型号。客户,工作和收据。
客户有很多工作,而工作有很多收据。工作属于客户,收据属于工作。
在我的客户删除def中,我想删除所有客户的工作和工作收据。这是我的控制器代码
def destroy
customer = Customer.find(params[:id])
customer.jobs.receipts.destroy_all #this line crashes
customer.jobs.destroy_all
customer.destroy
redirect_to customers_url
redirect_to show_todays_jobs_path
end
说customer.jobs.receipts.destroy_all的行会抛出一个错误,指出收据方法未定义。
但是,在我的Jobs控制器中,jobs.receipts.destroy_all工作正常。在客户控制器中,如果我删除该行以销毁收据,那么也可以正常工作。
我不明白为什么我无法删除Customer控制器中的收据。请帮帮我。提前致谢
答案 0 :(得分:2)
代码中的问题customer.jobs
是一个集合,其中每个作业记录都有自己的收据集合。您可以在Customer模型中使用关联has_many :receipts, through: :jobs
来获取直接customer.receipts
引用,然后您可以调用customer.receipts.delete_all
。 Documentation here
似乎您可以将dependent: :destroy
或dependent: :delete_all
用于您的关联has_many
,简要地说,它会在customer
对象被销毁时删除关联。查看documentation。
看看代码示例:
class Customer
has_many :jobs, dependent: :destroy
end
class Job
has_many :receipts, dependent: :destroy
end
然后当您致电customer.destroy
时,所有相关的工作和收据也可能被销毁。
PS。你在控制器代码中有另一个错误 - redirect_to
被调用两次,只有一次是可能的。
答案 1 :(得分:1)
您不应该在控制器中手动执行这些删除操作。您可以在模型中为关联提供参数,以告诉他们在销毁父级时销毁相关记录。
我已经对您的模型关联做了一些假设,但是下面的内容应该对您有用:
dependent: :destroy
在关联上设置destroy
告诉rails在删除父对象时通过调用destroy
方法删除关联的记录。
通过此设置,您可以在控制器内的find
操作中执行此操作(请注意,在您destroy
之前无需def destroy
Customer.destroy(params[:id])
redirect_to customers_url
end
您的记录:
plugins: [
{
package: 'protractor-ng-hint-plugin'
}