كيف يمكن حساب عدد السجلات التي تحتوي على قيمة فريدة من نوعها في مجال معين في ROR?

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

سؤال

لدي مجموعة السجلات التي تتضمن حقل التاريخ و تريد تحديد عدد فريدة من نوعها مواعيد ممثلة في مجموعة السجلات.

شيء من هذا القبيل:

Record.find(:all).date.unique.count 

ولكن بالطبع هذا لا يبدو أن العمل.

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

المحلول

ما كنت أمر SQL التالي:

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord وقد بنيت هذه في:

Record.count('date', :distinct => true)

نصائح أخرى

هذا قد تغير قليلا في القضبان 4 وما فوق :distinct => true هو الآن إهمال.استخدام:

Record.distinct.count('date')

أو إذا كنت تريد التاريخ عدد:

Record.group(:date).distinct.count(:date)

خارج SQL:

Record.find(:all).group_by(&:date).count

ActiveSupport هو Enumerable#group_by أمر لا غنى عنه.

أحدث #count على القضبان البرمجية المصدر نقبل فقط 1 المعلمة.انظر: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

لذا تحقق الشرط

Record.count('DISTINCT date')

تفصيل الجواب:

Post.create(:user_id => 1, :created_on => '2010-09-29')
Post.create(:user_id => 1, :created_on => '2010-09-29')
Post.create(:user_id => 2, :created_on => '2010-09-29')
Post.create(:user_id => null, :created_on => '2010-09-29')

Post.group(:created_on).count
# => {'2010-09-29' => 4}

Post.group(:created_on).count(:user_id)
# => {'2010-09-29' => 3}

Post.group(:created_on).count(:user_id, :distinct => true) # Rails <= 3
Post.group(:created_on).distinct.count(:user_id) # Rails = 4
# => {'2010-09-29' => 2}

كما ذكرت هنا, في القضبان 4, باستخدام (...).uniq.count(:user_id) كما ورد في إجابات أخرى (على هذا السؤال في مكان آخر على ذلك) سوف يؤدي فعلا إلى إضافية DISTINCT يجري في الاستعلام:

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

ما علينا فعله هو استخدام سلسلة SQL أنفسنا:

(...).count("DISTINCT user_id")

مما يعطينا:

SELECT COUNT(DISTINCT user_id) FROM ...

أيضا, تأكد من أن لديك فهرس على حقل في ديسيبل ، أو آخر الاستعلام سوف تصبح بسرعة sloooow.

(انه من الأفضل أن تفعل هذا في SQL, خلاف ذلك يمكنك سحب كامل db الجدول في الذاكرة فقط للرد على العد.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top