Rails 3.1: Почему все раздающиеся карты оказываются привязанными к одному игроку? - PullRequest
1 голос
/ 02 марта 2012

Я новичок в Rails, поэтому прошу прощения за заголовок вопроса, я не знал, как это сформулировать. Не стесняйтесь изменить это. Я строю игру в покер, чтобы изучать рельсы, и у меня есть следующие ассоциации ...

class Game < ActiveRecord::Base
    has_many :players, :dependent => :destroy
    has_many :community_cards, :class_name => "Card", :dependent => :destroy, :conditions => { :is_community_card => true }
    has_many :used_cards, :class_name => "Card", :dependent => :destroy, :conditions => { :is_community_card => false }
    attr_accessible :pot, :name, :status

class Player < ActiveRecord::Base
    belongs_to :game
    has_many :cards, :dependent => :destroy
    attr_accessible :chip_count, :position, :fb_id
end

class Card < ActiveRecord::Base
    belongs_to :player
    belongs_to :game
    attr_accessible :face, :suit, :is_community_card
end

Когда я пытаюсь раздать случайные карты всем игрокам, все карты заканчиваются одним игроком ...

def deal_players_hole_cards
    players.all.each do |p|
        if(p.cards.count < 2)
            first_card = deal_card()
            second_card = deal_card()
            p.cards << first_card
            p.cards << second_card
        end
    end
end

Вот метод карты сделки ...

def deal_card
    card_was_found = false
    while(!card_was_found) do
        card_was_found = true
        random_suit = (0..3).to_a.sample
        random_face = (1..13).to_a.sample

        used_cards.all.each do |used_card|
            if(random_suit == used_card.suit and random_face == used_card.face)
                card_was_found = false
            end
        end
    end

    new_card = Card.create(:suit => random_suit, :face => random_face, :is_community_card => false)
    used_cards << new_card 
end

Есть два игрока, и у каждого игрока должно быть две карты, но вместо этого у одного игрока есть все четыре карты ...

ruby-1.9.2-p290 :001 > Game.last.players.last.cards.count
  Game Load (0.1ms)  SELECT "games".* FROM "games" ORDER BY "games"."id" DESC LIMIT 1
  Player Load (0.1ms)  SELECT "players".* FROM "players" WHERE "players"."game_id" = 2 ORDER BY "players"."id" DESC LIMIT 1
   (0.2ms)  SELECT COUNT(*) FROM "cards" WHERE "cards"."player_id" = 6
 => 4 
ruby-1.9.2-p290 :002 > Game.last.players.first.cards.count
  Game Load (0.4ms)  SELECT "games".* FROM "games" ORDER BY "games"."id" DESC LIMIT 1
  Player Load (0.3ms)  SELECT "players".* FROM "players" WHERE "players"."game_id" = 2 LIMIT 1
   (0.2ms)  SELECT COUNT(*) FROM "cards" WHERE "cards"."player_id" = 5
 => 0 

Большое спасибо заранее за всю вашу мудрость!

1 Ответ

0 голосов
/ 02 марта 2012

Я решил исправить это, передав объект игрока методу карты раздачи и прикрепив вновь созданные карты к игроку методом построения ...

####################################################################
    # Deals each player their two hole cards
    ####################################################################
    def deal_players_hole_cards
        players.all.each do |p|
            if(p.cards.count < 2)
                deal_card(p)
                deal_card(p)
            end
        end
    end

    ####################################################################
    # returns a random, unused card
    ####################################################################
    def deal_card(p)
        card_was_found = false
        while(!card_was_found) do
            card_was_found = true
            random_suit = (0..3).to_a.sample
            random_face = (1..13).to_a.sample

            used_cards.all.each do |used_card|
                if(random_suit == used_card.suit and random_face == used_card.face)
                    card_was_found = false
                end
            end
        end

        new_card = p.cards.build(:suit => random_suit, :face => random_face, :is_community_card => false)
        used_cards << new_card 
    end

Результаты ...

ruby-1.9.2-p290 :005 > Game.last.players.first.cards.count
  Game Load (0.3ms)  SELECT "games".* FROM "games" ORDER BY "games"."id" DESC LIMIT 1
  Player Load (0.4ms)  SELECT "players".* FROM "players" WHERE "players"."game_id" = 2 LIMIT 1
   (0.3ms)  SELECT COUNT(*) FROM "cards" WHERE "cards"."player_id" = 5
 => 2 
ruby-1.9.2-p290 :006 > Game.last.players.last.cards.count
  Game Load (0.4ms)  SELECT "games".* FROM "games" ORDER BY "games"."id" DESC LIMIT 1
  Player Load (0.4ms)  SELECT "players".* FROM "players" WHERE "players"."game_id" = 2 ORDER BY "players"."id" DESC LIMIT 1
   (0.2ms)  SELECT COUNT(*) FROM "cards" WHERE "cards"."player_id" = 6
 => 2 

Мне все еще интересно, почему мой старый код не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...