0

忍受我一秒钟...

我有两个模型:HorseRaceEvent 和 Wagerable。

Wagerable 使用具有两个子类的 STI:Trifecta 和 Wager。

Trifecta 和 Wager 之间存在亲子关系。对于 Trifecta,有 3 个与之相关的投注。为了在 Wager 与其父 Trifecta 之间建立关联,我为 Wager 记录使用了 parent_id 列,该列引用了 Trifecta 记录。如果投注不是 Trifecta 的一部分,则 parent_id 为空。(Trifecta 的 parent_id 始终为空。)

所以:

  • Trifecta 有很多赌注
  • 赌注属于 Trifecta

现在输入 HorseRaceEvent。

  • HorseRaceEvent 有很多赌注。
  • 赌注属于 HorseRaceEvent。

注意:请注意,与 HorseRaceEvent 的关系是 Wager,而不是 Wagerable 或 Trifecta。(对于 Trifecta 记录, horse_race_event_id 始终为空。)

HorseRaceEvent 有一个称为“状态”的属性,它可以具有三种状态:未开始、开始、最终。

Wagerable 有一个名为“结果”的属性,该属性具有以下三个值之一:null、W、L。

这是挑战:

对于 Trifecta 模型,我想实现一个 named_scope 或静态方法,它返回所有 Trifecta,其中 (1) 结果为 null 并且 (2) 其子 Wager 的关联 HorseRaceEvent 中的每一个都是“Final”。

4

1 回答 1

0
  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.statuswagerFinal

或者,您可以编写原始 SQL 查询,该查询将返回所有 Trifectas,其加入投注的计数等于加入 horse_race_event 状态 == 'Final' 的加入投注计数。

但最好的解决方案是优化您的架构。

于 2011-04-22T18:54:10.990 回答