مشكلة البرنامج المساعد لـ Rails الذي يعمل كقابل للقراءة

StackOverflow https://stackoverflow.com/questions/22980

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أستخدم Intridea بمثابة مقروءة ملحق Rails لنظام المراسلة الذي أقوم بإنشائه حاليًا.لقد حددت فئة رسالتي وفقًا لذلك:

class Post < ActiveRecord::Base
  acts-as-readable
end

ويبدو أن كل شيء يعمل وفقًا للخطة، ولكن عند محاولة جعل التطبيق يعرض الرسائل غير المقروءة في عرض الرسائل، أواجه مشكلات.

مثالهم:(لقد قمت بتغيير الشرطة السفلية إلى واصلات بسبب مشاكل التنسيق)

bob = User.find_by_name("bob")

bob.readings                      # => []

Post.find_unread_by(bob)          # => [<Post 1>,<Post 2>,<Post 3>...]
Post.find_read_by(bob)            # => []

Post.find(1).read_by?(bob)        # => false
Post.find(1).read_by!(bob)        # => <Reading 1>
Post.find(1).read_by?(bob)        # => true
Post.find(1).users_who_read       # => [<User bob>]

Post.find_unread_by(bob)          # => [<Post 2>,<Post 3>...]
Post.find_read_by(bob)            # => [<Post 1>]

bob.readings                      # => [<Reading 1>]

لذا يبدو أنني إذا أردت سرد عدد الرسائل غير المقروءة الموجودة في صندوق بريد (على سبيل المثال Inbox (39) )، فيجب أن أكون قادرًا على القيام بشيء مثل:

<%= Post.find_unread_by(current-user).count %>

ولكن دون جدوى.يبدو أنني دائمًا أتعثر في مشكلات العرض البسيطة بعد ضبط كل شيء.أيه أفكار؟

هل كانت مفيدة؟

المحلول

سوف يعمل ما يلي

<%= Post.find_unread_by(current_user).size %>

أو

<%= Post.find_unread_by(current_user).length %>

ومع ذلك، إذا قمت بفحص سجل التطوير الخاص بك، فيجب أن ترى أنه يحصل على عدد الرسائل غير المقروءة

  1. استرجاع كافة المشاركات
  2. - استرجاع كافة المشاركات التي قرأها المستخدم
  3. إزالة الكل 2.من 1.في روبي

سيكون هذا أداءً سيئًا للغاية مع وجود الكثير من المشاركات.

الطريقة الأفضل هي استرداد المشاركات التي قرأها المستخدم الحالي ثم استخدام ActiveRecord::Calculations للحصول على عدد دون استرداد جميع المشاركات في قاعدة البيانات

Post.count(:conditions => [ "id NOT IN (?)", Post.find_read_by(current_user)])

يجب أن ينتقل هذا إلى نموذج النشر الخاص بك لاتباع أفضل الممارسات لعدم وجود مكتشفات في العرض أو وحدة التحكم

Post.rb

def self.unread_post_count_for_user(user)
  count(:conditions => [ "id NOT IN (?)", Post.find_read_by(user)])
end

ثم سيكون وجهة نظرك فقط

<%= Post.unread_post_count_for_user(current-user) %>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top