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 查询!这可能是个坏主意。;)

我已经有了一个以前用 pluck 抓取的 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您可以通过使用添加到您的Pack类的参数来执行此操作,而无需查找模型has_and_belongs_to_many,如下所示:

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

设置后card_idsself.cards将是映射到这些 ID 的所有卡片。

于 2012-09-04T22:48:00.797 回答