首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回涉及STI和子类亲子关系的记录结果

返回涉及STI和子类亲子关系的记录结果
EN

Stack Overflow用户
提问于 2011-04-22 17:15:40
回答 1查看 130关注 0票数 0

忍受我一会儿..。

我有两个模型: HorseRaceEvent和Wagerable。

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

Trifecta和Wager之间有亲子关系。对于一个三人组来说,有三个与之相关的赌注。为了使Wagerand其父Trifecta之间的关联,我使用一个parent_id列来表示Wager,它引用了Trifecta记录。如果Wager不是Trifecta的一部分,那么parent_id为null。( Trifecta的parent_id总是空的。)

所以:

  • Trifecta有许多赌注
  • Wager属于Trifecta

现在输入HorseRaceEvent。

  • HorseRaceEvent有很多赌注,
  • Wager属于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”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-22 18:54:10

  1. 我不确定在这里使用STI是不是很酷(我看不出全局,所以这只是意见)。是的,它是完全相同的表结构,但不同的逻辑。因此,它们应该是独立的模型和表。
  2. 关于您的问题。

这不是一个很聪明的解决方案,因为它的性能,但对于小桌子,这是可以的。

代码语言:javascript
复制
class Trifecta < Wagerable
  def self.some_def_name
    Trifecta.all.select{ |t| t.wagers.all?{ |w| w.horse_race_event.status == "Final" } }
  end
end

没有什么进步

代码语言:javascript
复制
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‘的加入赌注计数。

但是最好的解决方案是优化您的体系结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5758038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档