2009-07-01 11 views
1

これは私の最初の投稿ですので、プロトコルに違反した場合は私にご負担ください。多くを選択しています...種類が

私はRailsのプロジェクト(2.1.2)に取り組んでいる、と私はこのようになります関係のシナリオがあります(異なるカテゴリ内)

event [has_many] days 

人々は、イベントの日にサインアップすることができ、

category [has_many] customers [has_many] orders [has_many] days 
[belongs_to] event 

は今、私は一人の顧客のための「イベント」の合計数を持っているしたいのですが、または特定のカテゴリ内のすべての顧客のために、そして私がこだわっている:以下の結合の結果を与えます。 AFAIK、一連のオブジェクトを使って簡単に「発見」する方法はない?では、解決策は何でしょうか。ネストされたループ、および収集方法を使用して 'days'から 'events'を取得しますか?

私に不明な点がある場合は教えてください。

ありがとうございました!

+0

最初の投稿は実際にはプログラミング関連であるため、正しい軌道に乗っています。 –

答えて

0

私は個人的にこれをMySQLステートメントを使用して行います。私は確かに分かりませんが、他の例(レールを使用して関連付けの方法を使用した方がずっと速いと思います)。すべてのイベントを返します

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 

: (「model_name_id」私はあなたがデフォルトの関連付けのキーを使用していると仮定していることに注意してください。)お客様のモデルにあなたが何かのような操作を行うことができることを意味し

ユーザーに関連付けられ、重複することはありません( 'DISTINCT'キーワードがそのことを確認します)。上記の例のように、ユーザーが登録した日の情報が失われます。あなたがその情報を必要とするならば、そう言いなさい。

また、自分のサンプルを自分で修正できると仮定しているため、カテゴリモデルの例は含まれていません。そうでない場合は、私に知らせてください。

EDIT:

私はただあなただけのイベントをカウントしたいお読みください。これは、count文を使用することでさらに高速に(または少なくともメモリ集約的に)行うことができます。それを使用するには、次の関数を使用してください:

def event_count 
    Event.count_by_sql(SELECT DISTINCT COUNT(e.*) FROM ... ... ... 
end 
0

あなたのモデルは、おそらく次のようになります。これにより

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 = {} 
category.customers.each {|c| events.merge!(c.days.count(:group => 'event_id')) } 
events.size # => 9 - it should be total number of events 

しかし、この場合、あなたで:カテゴリ内のすべての顧客のためのイベントをカウントする場合は

events.size # => 3 

を、私はこのような何かをしたいです各イベントが何回出現したかに関する情報を失う。

私はこれをテストしなかったので、間違いがあります。

関連する問題