0

私はいくつかのイベント、人を持っています。それらの間には多対多の関係があるため、イベントを People に接続する PersonEvent があります。

イベントには日付とタイプがあります

PersonEvent には event_id と person_id があります

人には名前がある

ユーザーがイベントの種類で検索できるようにする検索フォームを作成しようとしています。その後、過去にその種類のイベントに参加した人のリストと、そのようなイベントに最後に参加した日付を返します。これはコントローラーにあるはずです。

私が考えることができる唯一の解決策は、ネストされたループを含み、おそらく非常に遅く実行されます。私は間違いなく、必要のない多くのことをループしています。

For each person in Person.all
    For each personevent in PersonEvent.all
        Add the personevent to an array if the person_event.event.type is correct
    Now, loop through the array and find the event with the latest date. That's the date of the last Event attendance.

誰でもより良いアルゴリズムを提案できますか?

4

3 に答える 3

3

RoR では、次のようになります。

Person.joins(:events).where(events: { type: params[:type] })

Railsjoinsは を作成しINNER JOIN、 の基準を満たすイベントが関連付けられていない人を破棄しwhereます。

あなたは出席情報の日付をどのように保持しているかを説明していないので、それはあなたに任せます。

于 2013-07-17T16:10:48.563 に答える
1

関連付けが既に設定されているため、次のようなことができるはずです。

f = Person.joins(:events)
f = f.where(:events => { :type => "the_type_you_are_searching_for" })
f = f.group('people.id')
f = f.select('people.*, max(events.date) as last_event_date')
people = f.all # though you probably want to paginate really

ここでは読みやすくするために 1 行ずつ行っていますが、多くの場合、 が表示whereされ、同じ行に次々groupと連結されています。select

groupそうしないと、複数のイベントに参加したことがある人が複数回戻ってくることになります。

カスタムselectは、結果に を含めることlast_event_dateです。

于 2013-07-17T16:15:01.290 に答える