无法在Ruby on Rails中删除记录

时间:2016-01-21 19:00:04

标签: ruby-on-rails ruby

我有三个型号。客户,工作和收据。

客户有很多工作,而工作有很多收据。工作属于客户,收据属于工作。

在我的客户删除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控制器中的收据。请帮帮我。提前致谢

2 个答案:

答案 0 :(得分:2)

代码中的问题customer.jobs是一个集合,其中每个作业记录都有自己的收据集合。您可以在Customer模型中使用关联has_many :receipts, through: :jobs来获取直接customer.receipts引用,然后您可以调用customer.receipts.delete_allDocumentation here

似乎您可以将dependent: :destroydependent: :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'
}