كلما فكّرتُ في الأمر أكثر، زادت قنارتي بأن عدم تفعيل :user_updated عند تغيير عنوان البريد الإلكتروني يبدو وكأنه عيب. في الماضي، قبل وجود نموذج user_email، كان تغيير عنوان البريد الإلكتروني يُفعّل :user_updated.
لكن وجود UserEmail ` do
after_update :trigger_user_updated_event
مع الكود التالي
def trigger_user_updated_event
user = User.find(self.user_id)
DiscourseEvent.trigger(:user_updated, user)
true
end
يؤدي إلى تفعيل الحدث أكثر من اللازم (مثلًا عند تسجيل الدخول عبر رابط البريد الإلكتروني)، كما يتسبب أيضًا في ظهور الخطأ التالي:
PG::UniqueViolation - ERROR: duplicate key value violates unique constraint "index_group_users_on_group_id_and_user_id"
السبب ليس في كونها نموذجًا مختلفًا، كما اكتشفت. منذ دمج تغييرات @LeoMcA، أصبح النموذجان User و UserEmail منفصلين، لذا فإن تغيير مثيل من UserEmail لن يُفعّل مراقبًا (watcher) في مثيل من User.
self.add_model_callback(UserEmail, :after_commit, on: :update) do
puts "#{'-'*50}\nتم تحديث عنوان البريد الإلكتروني بنجاح لـ #{self.user_id}!!!!\n#{'-'*50}\n"
user = User.find(self.user_id)
GroupDomain.add_to_group_if_in_whitelisted_domain(user)
end