Возврат результатов записи с участием ИППП и родительско-дочерних отношений подкласса - PullRequest
0 голосов
/ 22 апреля 2011

Потерпи меня секунду ...

У меня есть две модели: HorseRaceEvent и Wagerable.

Wagerable использует STI с двумя подклассами: Trifecta и Wager.

Между Trifecta и Wager существуют отношения между родителями и детьми. Для Trifecta есть 3 ставки, связанные с ней. Чтобы установить связь между Wager и его родительским Trifecta, я использую столбец parent_id для записи Wager, которая ссылается на запись Trifecta. Если Ставка не является частью Trifecta, то parent_id является нулевым. (parent_id для Trifecta всегда нулевой.)

Итак:

  • У Trifecta много ставок
  • Ставка принадлежит Trifecta

Теперь введите HorseRaceEvent.

  • HorseRaceEvent имеет много ставок.
  • Ставка принадлежит HorseRaceEvent.

ПРИМЕЧАНИЕ: обратите внимание, что отношения с HorseRaceEvent являются Wager, а не Wagerable или Trifecta. (Horse_race_event_id всегда равен нулю для записи Trifecta.)

HorseRaceEvent имеет атрибут под названием «status», который может иметь три состояния: «Не запущен», «Запущен», «Окончательный».

Wagerable имеет атрибут с именем 'result', который имеет одно из трех значений: null, W, L.

Вот вызов:

Для модели Trifecta я хотел реализовать named_scope или статический метод, который возвращает все Trifectas, в которых (1) результат равен нулю и (2) каждый из связанных с дочерним элементом Wager HorseRaceEvent равен 'Final'.

1 Ответ

0 голосов
/ 22 апреля 2011
  1. Я не уверен, что использовать STI здесь здорово (я не вижу всей картины, так что это просто мнение).Да, это довольно та же структура таблицы, но другая логика.Поэтому они должны быть отдельными моделями и таблицами.

  2. О вашей проблеме.

Это не очень умное решение из-за производительности, но для небольшихс таблицами все в порядке.

class Trifecta < Wagerable
  def self.some_def_name
    Trifecta.all.select{ |t| t.wagers.all?{ |w| w.horse_race_event.status == "Final" } }
  end
end

с небольшим улучшением

class Trifecta < Wagerable
  def self.some_def_name
    Trifecta.includes(:wages => :horse_race_event).
      where(:wages => {:horse_race_event => {:status => "Final"}}).
      all.
      select{ |t| t.wagers.all?{ |w| w.horse_race_event.status == "Final" } }
  end
end

Для улучшения производительности и создания SQL-запроса здесь вы можете добавить новый столбец в wagerables таблицу со столбцом, в которой будет храниться trueесли все horse_race_event.status для каждого wager равны Final.

Или вы можете написать необработанный SQL-запрос, который будет возвращать все Trifectas с количеством присоединившихся ставок, равным количеству соединенных ставок с состоянием состоящей horse_race_event == 'Final'.

Но лучшее решение - это оптимизация вашей архитектуры.

...