حدد من خلال العديد من نوع من...
-
21-08-2019 - |
سؤال
هذا هو أول وظيفة على المكدس ، لذا يرجى تتحمل معي إذا كنت تنتهك أي بروتوكول.
أنا أعمل على مشروع في القضبان (2.1.2) و لدي علاقات السيناريو الذي يبدو مثل هذا:
event [has_many] days
الناس (في فئات مختلفة) يمكن الاشتراك في أيام المناسبات ، وإعطاء التالية ملزمة النتائج:
category [has_many] customers [has_many] orders [has_many] days
[belongs_to] event
الآن أود أن يكون العدد الإجمالي من "الأحداث" على عميل واحد أو لجميع العملاء في فئة معينة وأنا عالقة.AFAIK لا يوجد طريقة أداء بسيطة 'العثور على' من خلال مجموعة من الكائنات, صحيح ؟ إذا ماذا سيكون الحل ، حلقات متداخلة ، جمع طريقة للحصول على 'الأحداث' من 'الأيام' في الأوامر ؟
واسمحوا لي أن أعرف إذا أنا غير واضح.
شكرا على مساعدتكم!
المحلول
أنا شخصيا القيام بذلك باستخدام MySQL البيان.أنا لا أعرف على وجه اليقين ، ولكن أعتقد أنها أسرع كثيرا ثم أمثلة أخرى (باستخدام القضبان قدمت جمعية الطرق).
وهذا يعني أنه في نموذج العملاء هل يمكن أن تفعل شيئا مثل:(لاحظ أن أفترض أنك تستخدم الافتراضي جمعية مفاتيح:'model_name_id')
class Customer
def events
Event.find_by_sql("SELECT DISTINCT e.* FROM events e, days d, orders o, customers c WHERE c.id=o.customer_id AND o.id=d.order_id AND e.id=d.event_id")
end
end
أن يعود كل الأحداث المرتبطة المستخدم و لا تتكرر (إن 'مميزة' الكلمة يجعل متأكد من ذلك).وسوف ، كما في المثال أعلاه ، تفقد المعلومات حول ما أيام بالضبط المستخدم بالتسجيل.إذا كنت بحاجة إلى هذه المعلومات ، يرجى يقول ذلك.
أيضا, أنا لم تشمل على سبيل المثال الخاص بك الفئة نموذج, لأن أنا افترض أنك يمكن أن تتكيف مع بلدي على سبيل المثال نفسك.إذا لا, فقط اسمحوا لي أن أعرف.
تحرير:
لقد قرأت للتو كنت ترغب فقط في الاعتماد على الأحداث.الذي يمكن القيام به بشكل أسرع (أو على الأقل أقل من الذاكرة المكثفة) باستخدام العد البيان.لاستخدام هذا فقط استخدام الدالة التالية:
def event_count
Event.count_by_sql(SELECT DISTINCT COUNT(e.*) FROM ... ... ...
end
نصائح أخرى
والنماذج الخاصة بك ربما تبدو هذه:
class Category
has_many :customers
class Customer
has_many :orders
has_many :days, :through => :orders # I added this
belongs_to :category
class Order
has_many :days
belongs_to :customer
class Day
belongs_to :event
belongs_to :order
class Event
has_many :days
ومع هذا يمكنك الاعتماد الأحداث للعميل:
events = customer.days.count(:group => 'event_id')
ووسيعود OrderedHash مثل هذا:
#<OrderedHash {1=>5, 2=>13, 3=>0}>
ويمكنك الحصول على أحداث تحسب حسب:
events[event_id]
events[1] # => 5
events[2] # => 13
etc.
إذا كنت تريد العدد الإجمالي للأحداث UNIQ:
events.size # => 3
في حالة عد الأحداث لجميع العملاء في فئة كنت تفعل شيئا من هذا القبيل:
events = {}
category.customers.each {|c| events.merge!(c.days.count(:group => 'event_id') ) }
events.size # => 9 - it should be total number of events
ولكن في هذه الحالة تفقد المعلومات كم عدد المرات التي ظهر فيها كل حدث.
لم أكن اختبار هذا، لذلك يمكن أن يكون هناك بعض الأخطاء.