2009-12-03 4 views
0

Quel est le moyen le plus simple d'obtenir un tableau avec trois objets (Card), dont j'ai déjà un? Les deux autres doivent être choisis au hasard dans la base de données.Enregistrement actif: Obtenez deux objets aléatoires?

Mon approche actuelle ressemble à ceci:

[ 
    @deck.cards[rand(@deck.cards.size)], 
    @deck.cards[rand(@deck.cards.size)], 
    @mycard 
].sort_by {rand} 

Le problème que j'ai droit est maintenant que parfois @mycard montre deux fois dans le tableau. Comment cela peut-il être évité?

Répondre

1

Obtenez une carte du paquet. Vérifiez que ce n'est pas le samy comme @mycard.

Obtenez une autre carte du paquet. Vérifiez que ce n'est pas la même chose que @mycard ou la carte précédente.

Assez simple, j'aurais pensé.

+0

Yeah- Je pensais que peut-être il y avait un chemin plus court pour le faire que j'avais oublié, mais je suppose que non. – igul222

0

Vous devez retirer chaque carte du paquet lorsque vous en tirez, à moins que vous ne procédiez à un remaniement après chaque tirage, auquel cas je dessinerais à nouveau jusqu'à ce que vous obteniez une carte unique que vous n'avez pas déjà dessinée.

2

quelque chose comme cela pourrait fonctionner:

class Card < ActiveRecord::Base 
    belongs_to :deck 

    named_scope :random, lambda { 
     { :offset => Kernel.rand(Card.count) } 
    } 

    named_scope :not_in, lambda { |a| 
     { :conditions => [ 'id NOT IN (?)', a ] } 
    } 
end 

my_cards = [] 
@mycard = Card.last 
my_cards << @mycard 
2.times { 
    my_cards << @deck.cards.not_in(my_cards.collect(&:id)).random 
} 
Questions connexes