忍受我一会儿..。
我有两个模型: HorseRaceEvent和Wagerable。
Wagerable使用STI有两个子类: Trifecta和Wager。
Trifecta和Wager之间有亲子关系。对于一个三人组来说,有三个与之相关的赌注。为了使Wagerand其父Trifecta之间的关联,我使用一个parent_id列来表示Wager,它引用了Trifecta记录。如果Wager不是Trifecta的一部分,那么parent_id为null。( Trifecta的parent_id总是空的。)
所以:
现在输入HorseRaceEvent。
注意:请注意,与HorseRaceEvent的关系是Wager,而不是Wagerable或Trifecta。(对于Trifecta记录,horse_race_event_id始终为空。)
HorseRaceEvent有一个名为“status”的属性,它可以有三种状态:未启动、启动、最终状态。
Wagerable有一个名为“结果”的属性,它有三个值之一: null、W、L。
这是一个挑战:
对于Trifecta模型,我希望实现一个named_scope或静态方法,该方法返回所有Trifectas,其中(1)结果为null,(2)每个子Wager的关联HorseRaceEvent都是“Final”。
发布于 2011-04-22 18:54:10
这不是一个很聪明的解决方案,因为它的性能,但对于小桌子,这是可以的。
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表中添加新列,如果每个wager的所有horse_race_event.status都是Final,那么列wich将存储true。
或者您可以编写原始SQL查询,该查询将返回所有带有连接打赌计数的三重属性,等于加入horse_race_event status == 'Final‘的加入赌注计数。
但是最好的解决方案是优化您的体系结构。
https://stackoverflow.com/questions/5758038
复制相似问题