ActiveRecord удаление строки с помощью has_many :через ассоциацию

#methods #activerecord #associations

Вопрос:

Поэтому я немного попрактиковался в кодировании, где наткнулся на запрошенный результат для приложения, в котором метод может запустить актера через класс Movie. Технически это займет actor (экземпляр Actor класса) и удалит их роль из этого фильма, удалив строку из класса «роли». (Надеюсь, я правильно объяснил это)

Я действительно попробовал кое-что, и это сработало, однако я не понимаю, почему это сработало, и мне нужно какое-то объяснение, чтобы понять это. Это выглядит примерно так:

 class Movie < ActiveRecord::Base
    has_many :roles
    has_many :actors, through: :roles

    def fire_actor(actor)
        self.actors.destroy(actor.id)
    end
end
 

Когда я попробовал это несколькими разными способами, это единственный, который сработал для меня. Я думал, что если сделать это так, то это приведет к удалению актера из таблицы «актеры». Однако он сделал то, что хотел результат, и просто удалил его из таблицы «роли», которая была связана с идентификатором actor_id.

В какой-то момент я нашел и другой способ заставить этот метод работать:

     def fire_actor(actor)
        self.roles.find { |role| role.actor_id == actor.id }.destroy
    end
 

Я лично могу легче прочитать это и понять, как это работает.

Итак, это подводит меня к этим последним вопросам:

  1. Как сработал первый метод?
  2. Является ли второй метод, над которым я работал, предпочтительнее первого из-за простой удобочитаемости, или есть какие-то другие факторы?

Я просто хочу более глубоко понять, что здесь произошло, чтобы убедиться, что я хорошо знаю концепции.

Мы будем признательны за любую помощь и разъяснения. Спасибо!