ترتيب مشاركات Rake:reorder_posts يعطي خطأ `UniqueViolation`

السياق: أحاول تقسيم منشور. للقيام بذلك، أعتقد أنني بحاجة إلى:

  • إنشاء منشور جديد في الموضوع.
  • تعديل محتوى كلا المنشورين كما أريد.
  • تغيير مالك المنشور الذي أنشأته ليتطابق مع المنشور الأصلي.
  • تغيير الطابع الزمني للمنشور الذي أنشأته ليتطابق مع المنشور الأصلي (ربما بإضافة بضع ثوانٍ).
  • تشغيل posts:reorder_posts[topic_id] لنقل ردي في الموضع الصحيح في الموضوع.

أول شيء جربته هو استدعاء posts:reorder_post، “فقط لأرى”، لكنه فشل:

root@discourse1-app:/var/www/discourse# rake "posts:reorder_posts[879]"
rake aborted!
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "post_timings_unique"
DETAIL:  Key (topic_id, post_number, user_id)=(879, 93, 1) already exists.
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `exec'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:209:in `run'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `block in with_lock'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `with_lock'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `run'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:181:in `exec'
/var/www/discourse/lib/tasks/posts.rake:383:in `block (3 levels) in <main>'
/var/www/discourse/lib/tasks/posts.rake:366:in `each'
/var/www/discourse/lib/tasks/posts.rake:366:in `block (2 levels) in <main>'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/transactions.rb:209:in `transaction'
/var/www/discourse/lib/tasks/posts.rake:329:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => posts:reorder_posts
(See full trace by running task with --trace)

ومن المثير للاهتمام أنني لا أرى أي منشور مرقم 93 في الموضوع. أرى 92 و 94. المستخدم 1 هو أنا، لكن المنشورين 92 و 94 ليسا لي.

لقد قمت بتقسيم الموضوع سابقًا، لذا ربما انتقل المنشور 93 إلى موضوع آخر، لا أعرف.

إعجاب واحد (1)

أواجه نفس المشكلة، نفس التتبع. هل هناك حل؟

أعتقد أن هذا غير ممكن. سيتم إعادة حساب رقم المشاركة إذا تم فصل مشاركة من الموضوع (لأنها ليست معرف مشاركة ولكن ترتيب المشاركات في الموضوع). يمكن أن تكون مشاركة إجراء صغيرة لا تبدو كمشاركة “حقيقية” ولكنها لا تزال تُحتسب على أنها كذلك (الهمسات ستُحتسب أيضًا، ولكن إذا كنت تقوم بتشغيل مهام rake، فأنا أفترض أنك مسؤول يمكنك رؤيتها).

أتساءل عما إذا كان حذف مشاركة الإجراء الصغيرة سيساعد في هذا الموقف؟ هل يبدو هذا وكأنه قد يكون المشكلة بالنسبة لك @UndecidedAdmin؟

إعجابَين (2)

لست متأكدًا مما تقصده. لست متأكدًا مما هو “منشور إجراء صغير”، على الرغم من أنه إذا كان منشورًا حول تقسيم المواضيع، فنعم، قد تكون هذه هي المشكلة. أحصل على هذا الخطأ:

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint “post_timings_unique” (PG::UniqueViolation)
DETAIL: Key (topic_id, post_number, user_id)=(54, 2150, 1) already exists.

عندما أذهب إلى هذا الرابط:

https://[site]/t/[slug]/54/2150

المنشور هو في الواقع 2151، ويقول “تم تقسيم هذا الموضوع في 11 ديسمبر 2021”. المنشور الذي يعلوه مباشرة هو 2143، لذا أخمن أنه تم نقل 2150 إلى موضوع مختلف، وبعض الجدول لديه مرجع خاطئ إليه.

إعجاب واحد (1)

في Unable to move posts between topics - #2 by nat تم الإعلان عن إصلاح لهذا الخطأ.

3 إعجابات

تم إغلاق هذا الموضوع تلقائيًا بعد 90 يومًا من آخر رد. لم يعد يُسمح بالردود الجديدة.