Не можете перебрать объект ActiveRecord_Associations_CollectionProxy в действии уничтожения контроллера? - PullRequest
0 голосов
/ 23 января 2019

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

Чтобы лучше объяснить мою проблему, я поделюсь некоторым кодом.

Вот как выглядит мой код контроллера:

def destroy
  @role.destroy
  // Simple puts to show what data is here
  puts @role # => <Role:0x000055850068acb0>
  puts @role.rules.inspect # => <ActiveRecord::Associations::CollectionProxy []>
  @role.rules.map do | rule |
    puts rule # => doesn't output anything
    SomeClass.new(@role.rules, rule.field, ...).call_function()
  end
end

Вот как я назначаю роль:

def set_role
  @role = current_company.roles.find_by_id!(params[:id])
end

Проблема в том, что цикл по правилам ролей, т.е. @role.rules.map не работает, я предполагаю, что это потому, что дочерние элементы ролей уже удалены.

Ассоциация имеет предложение dependent: :destroy.

Как мы видим, объект ActiveRecord::Associations::CollectionProxy [] пуст, поскольку все дочерние роли удаляются при удалении роли.

Как мне обеспечить захват роли и ее зависимых ассоциаций даже после удаления действия удаления? Я надеюсь это имеет смысл. Я попытался абстрагироваться и сделать это как можно проще. Извините, если код не имеет смысла, я объясняю это, не раскрывая много кода. Спасибо

EDIT

Я понимаю, что есть проблема с вопросом.

В игре есть еще один стол, Bundle. Правило belongs_to a bundle и bundle has_many. Поэтому, удалив роль, я хочу убедиться, что могу отправить сообщение об обновлении пакета с удалением правил.

NB SomeClass - это библиотечный класс, внутри /lib, который я использую для отправки событий. Это в основном означает, что я отправляю сообщение с подробной информацией о Bundle. Это сообщение говорит нам, что когда роль была удалена, правила были удалены, и это bundle без следующих правил.

Ответы [ 2 ]

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

Цель вашего кода, кажется, потеряна в ваших попытках абстрагировать проблему (что хорошо, простой код - это хорошо).Ваша цель - использовать атрибутные данные из rules в экземплярах новых SomeClass es?Другими словами, вы хотите удалить записи (как Role, так и Rule s), но использовать атрибуты из удаленных Rule s, чтобы создать несколько новых SomeClass экземпляров.

Itмне кажется, что до вызова @role.destroy вы могли бы сохранить результат @role.rules.map(&:dup) в переменной.Это дублирует роли, но не назначит им новые идентификаторы (или не сохранит их в базе данных).

В качестве альтернативы, есть ли что-то плохое в простом создании экземпляров SomeClass перед вызовом @role.destroy?Или вам нужно убедиться, что @role уничтожен до создания SomeClass es?

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

Насколько я понимаю, вы можете использовать обратный вызов в ваших моделях

откройте приложение для подражания / models / role.rb

class Role < ApplicationRecord
  # callback
    before_destroy :check_rules


  # here is the callback method that will run automatically before destroy
  def check_rules
    puts self # in model your @role is equal to self
    self.rules.map do |rule|
      puts rule
      # other action
    end
  end
end
...