Активная запись: получить два случайных объекта? - PullRequest
0 голосов
/ 04 декабря 2009

Какой самый простой способ получить массив с тремя объектами (Card), один из которых у меня уже есть? Два других должны быть случайным образом выбраны из базы данных.

Мой текущий подход выглядит так:

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

Проблема, с которой я столкнулся сейчас, заключается в том, что иногда @mycard появляется дважды в массиве Как этого можно избежать?

Ответы [ 3 ]

2 голосов
/ 04 декабря 2009

что-то вроде этого может работать:

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
}
1 голос
/ 04 декабря 2009

Получить карту из колоды. Убедитесь, что это не тот самый @ mycard.

Получить еще одну карту из колоды. Убедитесь, что это не то же самое, что @mycard или предыдущая карта.

Довольно просто, я бы подумал.

0 голосов
/ 04 декабря 2009

Вы должны удалять каждую карту из колоды, когда вытягиваете ее, если только вы не собираетесь переставлять после каждого розыгрыша, и в этом случае я просто буду разыгрывать снова, пока вы не получите уникальную карту, которую вы еще не взяли. 1001 *

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