活动记录:获取两个随机对象?

时间:2009-12-03 23:33:06

标签: ruby-on-rails activerecord

获取具有三个对象(Card)的数组的最简单方法是什么,其中一个我已经拥有?其他两个应该从数据库中随机选择。

我目前的做法如下:

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

我现在遇到的问题是,有时@mycard会在数组中出现两次。如何避免这种情况?

3 个答案:

答案 0 :(得分:2)

这样的事情可能有用:

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 :(得分:1)

从牌组中取出一张牌。检查它不是@mycard的傻瓜。

从牌组中取出另一张牌。检查它与@mycard或之前的卡不一样。

非常直白,我想过。

答案 2 :(得分:0)

你必须从牌组中取出每张牌,除非你在每次抽签后重新洗牌,在这种情况下我会再画一次,直到你得到一张你还没画过的独特牌。 / p>