【问题标题】:Can't Delete Records In Ruby on Rails无法在 Ruby on Rails 中删除记录
【发布时间】:2016-01-21 19:00:03
【问题描述】:

我有三个模型。客户、工作和收据。

客户有很多工作,工作有很多收据。 Job 属于 Customer,Receipts 属于 Job。

在我的客户删除定义中,我想删除所有客户的工作和工作收据。这是我的控制器代码

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 可以正常工作。在客户控制器中,如果我删除线路以销毁收据,那么它也可以正常工作。

我不明白为什么我无法删除客户控制器中的收据。请帮帮我。提前致谢

【问题讨论】:

  • 你能显示 Jobs 控制器吗?
  • 我们需要查看您拥有的模型关系。

标签: ruby-on-rails ruby


【解决方案1】:

您的代码中存在问题,即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 调用了两次,只有一次是可能的。

【讨论】:

    【解决方案2】:

    您不应该在控制器中手动执行这些删除操作。您可以向模型中的关联提供一些参数,以告诉它们在销毁父级时销毁关联的记录。

    我对您的模型关联做了一些假设,但以下内容应该适合您:

    class Customer < ActiveRecord::Base
      has_many :jobs, dependent: :destroy
    end
    
    class Job < ActiveRecord::Base
      belongs_to :customer
      has_many :receipts, dependent: :destroy
    end
    
    class Receipt < ActiveRecord::Base
      belongs_to :job
    end
    

    在关联上设置dependent: :destroy 告诉rails 在删除父对象时通过调用它们的destroy 方法来删​​除关联的记录。

    通过此设置,您只需在控制器中的 destroy 操作中执行此操作(请注意,在您 destroy 之前无需 find 您的记录):

    def destroy
      Customer.destroy(params[:id])
      redirect_to customers_url
    end
    

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多