目前,我有一些代码可以为一款看起来像这样的游戏生成一包交易卡;
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用于创建新卡,而非新参考。
答案 0 :(得分:3)
为什么不使用in
(未经测试但关闭):
self.cards = Card.where('id in (?)', ids.sample(15))
或直接设置ID:
self.card_ids = ids.sample(15)
答案 1 :(得分:1)
您可以使用card_ids
类添加Pack
类has_and_belongs_to_many
的{{1}}参数来查找模型,如下所示:
self.card_ids << ids[rand(ids.length)]
设置card_ids
后,self.cards
将成为映射到这些ID的所有卡片。