Если вы хотите обработать это в самом стеке Rails, один из способов, с помощью которых я сейчас решаю подобную ситуацию, - использование метода обратного вызова ActiveRecord. Документация для этого доступна здесь . В вашей модели, где атрибут был изначально изменен, вы можете использовать обратный вызов after_validation_on_create:
after_validation_on_create :toggle_other_table_asset
def toggle_other_table_asset
if self.in_use
sibling.in_use = 1
else
sibling.in_use = 0
end
sibling.save
end
Вы также можете рассмотреть возможность использования транзакции ActiveRecord для обеспечения целостности ваших данных, более подробную информацию можно найти здесь .
Лучший совет, который я могу вам дать, - рассмотреть потенциальные недостатки обеспечения того, чтобы все было сделано на прикладном уровне. Есть также недостатки, связанные с соединением ваших данных таким способом. Возможно, вам следует подумать о рефакторинге ваших моделей, чтобы избежать дублирования данных.
Примеры того, где что-то может пойти не так, включают сценарии обслуживания, которые запускаются по выходным, которые очищают вашу базу данных, или взаимодействуют с интерфейсом командной строки вашей базовой базы данных и изменяют атрибуты виновника вручную ... без программирования базы данных TRIGGER, вы ' Вы рискуете нарушить целостность ваших данных.