كيف يمكن حساب عدد السجلات التي تحتوي على قيمة فريدة من نوعها في مجال معين في ROR?
-
09-06-2019 - |
سؤال
لدي مجموعة السجلات التي تتضمن حقل التاريخ و تريد تحديد عدد فريدة من نوعها مواعيد ممثلة في مجموعة السجلات.
شيء من هذا القبيل:
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 الجدول في الذاكرة فقط للرد على العد.)