0

現時点では、次のようなゲームのトレーディングカードのパックを生成するためのコードがいくつかあります。

class Pack < ActiveRecord::Base
  belongs_to :user
  belongs_to :release
  has_and_belongs_to_many :cards

  after_create :fill_pack

  private

  # Randomly generate pack contents
  def fill_pack
    ids = self.release.cards.pluck(:id)
    (15).times do |i|
      self.cards << Card.find(ids[rand(ids.length)])
    end
  end
end

私に関係する特定の部分はですself.cards << Card.find(ids[rand(ids.length)])。これは15のSELECTクエリを作成しています!それはおそらく悪い考えです。;)

私はすでに、以前に取得したIDのリストを持っています。私がそれらを使うことができる何らかの方法があるに違いありませんね?私は試しself.cards.create :card_id => ids[rand(ids.length)]ましたが、self.cards.createは新しいカードを作成するためのものであり、新しい参照ではありません。

4

2 に答える 2

3

なぜin(テストされていないが近い)を使用しないのですか?

self.cards = Card.where('id in (?)', ids.sample(15))

または、IDを直接設定します。

self.card_ids = ids.sample(15)
于 2012-09-04T22:45:09.247 に答える
1

次のように、によってクラスcard_idsに追加されるパラメーターを使用して、モデルを検索せずにこれを行うことができます。Packhas_and_belongs_to_many

self.card_ids << ids[rand(ids.length)]

を設定するとcard_idsself.cardsそれらのIDにマップされるすべてのカードになります。

于 2012-09-04T22:48:00.797 に答える