3

私は人々のテーブルを持っています。イベントの表もあります。各イベントには複数のショーがあります(各ショーには複数のチケットがあり、各チケットにはバイヤー(人)がいる場合とない場合があります)。ただし、各人は異なるイベントへの複数のチケットを持つことができます。

私の現在の試みは次のようになります。

Person.joins(tickets: {shows: :events}).where("events.id" => 1)

そして、次のSQLを生成します。

SELECT *
  FROM "people"
  INNER JOIN "tickets"
    ON "tickets"."buyer_id" = "people"."id"
  INNER JOIN "shows"
    ON "shows"."id" = "tickets"."show_id"
  INNER JOIN "events"
    ON "events"."id" = "shows"."event_id"
WHERE
  "events"."id" = 1;

しかし、私の理解では、クエリは各人に対して1つのチケットしか返しません。自分の参加についてはよくわかりませんが、すべてのチケットを表示する(したがってすべてのイベントを表示する)には、人とチケットの間に適切な外部結合が必要であると考えるのが安全です。これは正しいです?そして、それをActiveRecord / Arelに実装するにはどうすればよいですか?

特定のイベントのチケットを持っているすべての人を見つけるにはどうすればよいですか?

4

1 に答える 1

5

私もDBの専門家ではありませんが、私が知っていることによると、これが機能する方法です。

  1. 人の内部参加チケットは、人が所有するすべてのチケットの行を提供します(人が複数のチケットを持っている場合は、重複する人のエントリが含まれます)
  2. 内部参加ショーは、ショーを行に追加するだけです(すべてのチケットが1つのショーのみに属すると仮定します)
  3. 内部参加イベントは、イベント情報を追加するだけです(すべてのショーが1つのイベントのみに属すると仮定します)
  4. ここで、event.id = 1は、イベントID1の行のみをテーブルに残します。

これがあなたが探しているものだと思います。

ところで、上記のコードの命名規則は、リレーションの定義に問題がある可能性があることを示しています。私はそれが次のようになることを期待します:

Person.joins(tickets: {show: :event})ではなく

Person.joins(tickets: {shows: :events})チケットは単一のショーに属し、ショーは単一のイベントに属します。私は何かが足りないのですか?

于 2012-07-10T17:12:13.363 に答える