1

これはスタックに関する私の最初の投稿です。プロトコルに違反した場合はご容赦ください。

Rails (2.1.2) のプロジェクトに取り組んでおり、次のようなリレーション シナリオがあります。

event [has_many] days

(さまざまなカテゴリの) 人々がイベントの日にサインアップすると、次の拘束力のある結果が得られます。

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

ここで、1 人の顧客、または特定のカテゴリのすべての顧客の「イベント」の総数を知りたいのですが、行き詰まっています。私の知る限り、オブジェクトの配列を介して単純な「検索」を実行する方法はありませんよね?では、解決策は何でしょうか。ネストされたループ、および注文の「日」から「イベント」を取得するための収集方法?

不明な場合はお知らせください。

ご協力いただきありがとうございます!

4

2 に答える 2

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.

一意のイベントの総数が必要な場合:

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

ただし、この場合、各イベントが何回発生したかについての情報が失われます。

私はこれをテストしなかったので、いくつかの間違いがあるかもしれません。

于 2009-07-01T10:48:58.403 に答える
0

個人的には、MySQL ステートメントを使用してこれを行います。確かなことはわかりませんが、他の例よりもはるかに高速だと思います(レールが提供する関連付けメソッドを使用)。

つまり、 Customer モデルでは次のようなことができます: (デフォルトの関連付けキーを使用していると仮定していることに注意してください: '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

これにより、ユーザーに関連付けられたすべてのイベントが返され、重複はありません (「DISTINCT」キーワードがそれを確認します)。上記の例と同様に、ユーザーがサインアップした正確な日付に関する情報が失われます。その情報が必要な場合は、そう言ってください。

また、Category モデルの例は含めていません。これは、私の例を自分で適応できると想定していたからです。そうでない場合は、お知らせください。

編集:

イベントを数えたいだけだと読みました。これは、count ステートメントを使用して、さらに高速に (または、少なくともメモリの消費を抑えて) 行うことができます。それを使用するには、次の関数を使用します。

def event_count
  Event.count_by_sql(SELECT DISTINCT COUNT(e.*) FROM ... ... ...
end
于 2009-07-01T13:24:49.540 に答える