【问题标题】:Refactoring ActiveRecord query重构 ActiveRecord 查询
【发布时间】:2013-10-13 02:24:46
【问题描述】:

我有一个 ActiveRecord 查询,它会拉取一个随机选择的 Matchup 对象,其中该对决中的任何一名球员都不属于当前对手名称为“Bye Week”的球队。

模型定义:

Matchup 有两个字段,player_1 和 player_2,是 Player 对象的 ID。

每个玩家都属于_to Team,它有几个字段,例如对手周_1,对手周_2 ...对手周_17。

current_week 根据今天的日期返回一个介于 1 和 17 之间的整数(它决定了我们当前处于 NFL 赛季的哪一周)。

现在我正在这样做,但我想删除循环,并只使用一个查询来随机选择一个满足条件的对象:

def getRandomMatchup
  current_week = view_context.current_week

  matchup = Matchup.order("RANDOM()").first

  opponent1 = Team.find(Player.find(m.player_1).team.send("opp_week_#{current_week}")).name    
  opponent2 = Team.find(Player.find(m.player_2).team.send("opp_week_#{current_week}")).name

  while opponent1 == "Bye Week" || opponent2 == "Bye Week"
    matchup = Matchup.order("RANDOM()").first

    opponent1 = Team.find(Player.find(matchup.player_1).team.send("opp_week_#{current_week}")).name
    opponent2 = Team.find(Player.find(matchup.player_2).team.send("opp_week_#{current_week}")).name
  end 

  return matchup
end

我的想法是做这样的事情,但我不确定如何正确执行它:

m = Matchup.where.not(Team.find(Player.find(m.player_1).team.send("opp_week_#{current_week}")).name: "Bye Week",
    Team.find(Player.find(m.player_2).team.send("opp_week_#{current_week}")).name: "Bye Week").order("RANDOM()").first

我正在使用 Ruby 2 和 Rails 4。

【问题讨论】:

  • 嗯,这有点令人困惑。 player_1player_2 外键也是如此,还是这些方法返回实际的玩家对象?另外,您能否发布通过send 调用的该方法的定义?
  • 我第二次去depa。请粘贴您的表结构。并提供一些时尚的例子:这些是我拥有的记录:.....这些我想要获取:......
  • 是的,至少发布一下球队、球员和比赛是如何关联的。请使用描述性变量名! o1o2m 不要告诉读者任何事情。
  • @depa,我添加了描述并更新了变量名,有什么建议吗?
  • @EdgarsJekabsons,我添加了描述并更新了变量名,有什么建议吗?

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord


【解决方案1】:

所以你需要在本周的对手不是“再见周”的两个随机玩家之间生成对战?

怎么样

Player.joins(:teams).where.not('team.opponent_week_#{current_week}' => 'Bye Week').limit(2)

现在,这并没有考虑随机性,并留下了两名球员属于同一支球队的可能性。

编辑:

Matchup.joins(:players).where('players.id = ? OR players.id = ?', player_1, player_2).joins(:teams).where.not('team.opponent_week_#{current_week}' => 'Bye Week')

【讨论】:

  • 有点。我不是在生成 Matchup,它们都是在 Matchup 模型中生成并存储的。我正在随机选择一场比赛,其中比赛中的两名球员都不在当前对手是“再见周”的球队中。这有意义吗?
  • @jackerman09 那么所有可能的比赛都已经存在了吗?与其随机选择一个 Matchup 并查看它是否满足条件,不如在 Matchup 生成时强制执行条件?没关系,我知道原因:因为条件(再见或不再见)每周都在变化。
  • 更正所有已存在的对决,并且您完全正确地认为它们每周都在变化。关于如何做到这一点的任何想法?我的想法是查询满足non-bye-week条件的记录,然后随机排序,取第一条记录,但不知道如何获取初始查询。
  • 查看编辑。这应该返回一个匹配数组,如果是这样,只需随机选择一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多