通过id添加rails关系而不是查找?

时间:2012-09-04 22:40:54

标签: ruby-on-rails activerecord orm

目前,我有一些代码可以为一款看起来像这样的游戏生成一包交易卡;

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用于创建新卡,而非新参考。

2 个答案:

答案 0 :(得分:3)

为什么不使用in(未经测试但关闭):

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

或直接设置ID:

self.card_ids = ids.sample(15)

答案 1 :(得分:1)

您可以使用card_ids类添加Packhas_and_belongs_to_many的{​​{1}}参数来查找模型,如下所示:

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

设置card_ids后,self.cards将成为映射到这些ID的所有卡片。