2016-01-21 3 views
0

У меня есть три модели. Клиент, Работа и получение.Не удается удалить записи в Ruby on Rails

У Клиента много вакансий и вакансий есть много квитанций. Работа принадлежит Клиенту, а квитанции принадлежат Job.

В моем delete 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.receipts.destroy_all работает нормально. В контроллере клиента, если я удалю строку, чтобы уничтожить квитанции, тогда это тоже отлично работает.

Я не понимаю, почему я не могу удалить квитанции в контроллере Клиента. Пожалуйста, помогите мне здесь. Заранее спасибо

+0

Не могли бы вы показать контроллер Работа? –

+1

Нам нужно видеть отношения модели, которые у вас есть. –

ответ

2

Проблема в вашем коде, которую customer.jobs является коллекцией, где каждый запись о работе имеет свою собственную коллекцию квитанций. Вы можете использовать ассоциацию has_many :receipts, through: :jobs в модели Customer для получения прямого справочника 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

Вы не должны вручную удалять их вручную в своем контроллере. Существуют параметры, которые вы можете предоставить своим ассоциациям в своих моделях, чтобы сообщить им уничтожить связанные записи при уничтожении родителя.

Я сделал некоторые предположения о ваших модельных ассоциациях, но что-то вдоль линий должны работать для вас:

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 Установка на ассоциации говорит рельсы, чтобы удалить соответствующие записи, вызвав их destroy при удалении родительского объекта.

С этим набором, вы можете просто сделать это в destroy действия в контроллере (обратите внимание, что нет никакой необходимости find вашу запись перед вами destroy его):

def destroy 
    Customer.destroy(params[:id]) 
    redirect_to customers_url 
end 
Смежные вопросы