Rails 6: Может ли модель знать об изменениях, внесенных в одну из ассоциаций has_many? - PullRequest
0 голосов
/ 23 января 2020

У меня есть модель Profile со многими gallery_items.

class Profile < ApplicationRecord
  # ...

  has_many :gallery_items, dependent: :destroy
  accepts_nested_attributes_for :gallery_items, allow_destroy: true

Я хочу использовать код в Profile каждый раз, когда элемент галереи изменяется. Есть ли способ сделать это без изменения класса GalleryItem?

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Rails 6 имеет только 4 возможных ActiveRecord Обратные вызовы ассоциации на данный момент: before_add, after_add, before_remove and after_remove.

Источник: Здесь

К сожалению, как Сами имена предполагают, что они не знают об обновлениях или изменениях в связанных объектах, поэтому, если вы хотите быть в курсе обновлений элементов галереи, необходимо сделать небольшие изменения в классе GalleryItem, как, например, предложил Джаред, или использовать after_update .

0 голосов
/ 23 января 2020

Вы можете использовать крючок after_touch в Профиле. Просто не забудьте указать, что GalleryItem касается профиля в его ассоциации.

class GalleryItem < ApplicationRecord
  belongs_to :profile, touch: true
end

class Profile < ApplicationRecord
  has_many :gallery_items
  after_touch :my_fancy_method

  private
    def my_fancy_method
      puts 'Doing some stuff after a GalleryItem was created/updated'
    end
end
...