2016-11-06 6 views
0

私は、プレーヤーが会社の株式を購入できるアプリを開発しています。特定の会社で最も多くの株式を所有しているプレーヤーが大統領です。 私は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 
+0

在庫表を行い、あなたのpresident_idのですか?また、「各株には所有者とは別の記録があります」と、株価表の株式には、購入した株式の量が記載されていますか? –

+0

株価表は実際には株価を発行した会社であるcompany_idと、所有者や会社、あるいは他のオブジェクトによっても株式を購入/所有することができるため、ownable_typeとownable_idを使用した多相関係を持っています。在庫表には何もありません。各レコードは1株のみを表します。 – Mischa

答えて

0

これはあなたの会社のための最大の株式を持つプレイヤーのIDを与えるこの

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 

を試してみてください。この条件をif条件の中に入れることができます。

0

これを行う方法は、キーがowner_idで、値がテーブル上にある場合にハッシュを生成することです。次に、このハッシュを使用して最大値のペアを見つけます。これは、配列[k, v] => [owner_id, count]の配列になります。この配列の最初の要素はOWNER_IDを持っているとのcompany_id

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

1ライナー

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

これは行く方法のように見えますが、余分なステップが必要です。 2人以上のプレーヤーがほとんどの株式のために結ばれているとき、大統領は同じままにする必要があります。これは、2つまたは4つの方法で結ぶ必要があります。 – Mischa

関連する問題