Rails如何检查哪个外键最多?

时间:2016-11-06 13:15:45

标签: ruby-on-rails foreign-keys

我正在建立一个玩家可以购买公司股票的应用程序。拥有特定公司股份最多的玩家是总统。 我有一个公司模型,其方法是check_president。无论何时购买或出售股票,都会调用此方法。 我有一个拥有所有者的股票模型。股票的所有者通过owner_id外键存储。因此,对于每个股票,都有一个单独的记录与自己的所有者。 检查公司总裁的最佳方法是什么?

类似的东西:

 def check_president
    player_owned_stocks = ownstocks.where(ownable_type: "Player")
    if(player_owned_stocks != nil)
        *** find player with most stocks, if tied presidency should not change ***
        president_id = player with most stocks
    else
        president_id = nil
    end
end

2 个答案:

答案 0 :(得分:0)

请试试这个

ownstocks.joins("LEFT JOIN players ON players.id = stocks.owner_id").select("COUNT(*) as total_stocks, players.id as id").group("players.id").order("total_stocks DESC").first.id

这将为您提供公司最大股票的玩家的ID。您可以将此查询放在if条件中。

答案 1 :(得分:0)

这样做的一种方法是生成一个哈希,其中键是owner_id,值是它在表上的计数。然后使用此哈希查找具有最大值的对。这将是[k, v] => [owner_id, count]形式的数组。这个数组的第一个元素是你的president_id

hash = player_owned_stocks.group(:owner_id).count
president_id = hash.max_by { |k,v| v }[0]

一个班轮

president_id = player_owned_stocks.group(:owner_id).count.max_by { |k,v| v }[0]