سؤال

هذا هو أول وظيفة على المكدس ، لذا يرجى تتحمل معي إذا كنت تنتهك أي بروتوكول.

أنا أعمل على مشروع في القضبان (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

ولكن في هذه الحالة تفقد المعلومات كم عدد المرات التي ظهر فيها كل حدث.

لم أكن اختبار هذا، لذلك يمكن أن يكون هناك بعض الأخطاء.

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