Ruby on rails 如何在rails中建模和创建自定义卡片组?

Ruby on rails 如何在rails中建模和创建自定义卡片组?,ruby-on-rails,Ruby On Rails,为了学习Rails,我正在尝试模拟一个纸牌游戏。这不同于标准的扑克牌组,因为扑克牌组中可以有一张扑克牌的多个副本。我在尝试初始化组时遇到问题。到目前为止,我已经有了一个基本的卡片模型,它有各种属性(比如副本在卡片组中),但没有关联。表示牌组中的牌的牌组模型(这是由于牌组中有多张相同的牌): 我正试图使甲板最小化,但遇到了各种各样的问题。我在甲板上试着做以下几件事 def initialize @cards = Card.find(:all) @cards.each do |card|

为了学习Rails,我正在尝试模拟一个纸牌游戏。这不同于标准的扑克牌组,因为扑克牌组中可以有一张扑克牌的多个副本。我在尝试初始化组时遇到问题。到目前为止,我已经有了一个基本的卡片模型,它有各种属性(比如副本在卡片组中),但没有关联。表示牌组中的牌的牌组模型(这是由于牌组中有多张相同的牌):

我正试图使甲板最小化,但遇到了各种各样的问题。我在甲板上试着做以下几件事

def initialize
  @cards = Card.find(:all)
  @cards.each do |card|
    # eventually another loop here on copies_in_deck
      @deck_cards.build(card)
  end
end
当我执行Deck.new时,我在nil.build上得到一个错误。为什么@deck_cards为零

我使用的是InstantTrails2,它有rails 2.0.2。我发现了如何在一个动作中创建多个模型,所以我尝试使用Deck.create!相反,得到了一个错误的参数数目


有什么建议吗?

ActiveRecord的子类不应该定义初始化方法,因为ActiveRecord会为您处理初始化方法

听起来你想要每张卡一张唱片。而且,模型DeckCard一次可以容纳多个卡片包

回复:为什么@deck_cards为零? 因为你没有把它放在任何地方

@deck_cards是一个实例变量。您试图对其调用build方法,但尚未将其设置为任何值。您应该在类DeckCard上调用build(或create或new方法)

如果要在DeckCard模型中创建和保存卡片:
DeckCard.create(card)#而不是@deck_cards.build(card)

Larry

不要在继承自ActiveRecord::Base的对象上使用#initialize。它将打破各种内部轨道魔法。相反,请使用此处记录的#after#initialize回调:

请注意,after#u initialize在查找之后以及在新创建的对象上调用,因此您需要包装初始化代码,以确保之前未保存该对象(使用#new_record?):

在过去,我采用了这种语法更好的替代方法,但请注意,在您尝试保存或验证记录之前,它不会生效

before_validation :build_default_associations, :if => :new_record?

def build_default_associations
  # initialize default associations here.
end
class-Deck
谢谢,成功了!我本来会把它标记出来的,但我没有代表我想我认为@deck_cards和self.deck_cards是一样的;我从我读到的关于关联和/或关联代理(可能没有正确的术语)的文章中得到了构建
def initialize
  @cards = Card.find(:all)
  @cards.each do |card|
    # eventually another loop here on copies_in_deck
      @deck_cards.build(card)
  end
end
def after_initialize
  if new_record?
    # initialize deck_cards here.
  end
end
before_validation :build_default_associations, :if => :new_record?

def build_default_associations
  # initialize default associations here.
end
class Deck < ActiveRecord::Base
  belongs_to :game
  has_many :deck_cards

  # To create new: Deck.new.build_deck
  def build_deck
    Card.find(:all).each do |card|
      self.deck_cards << DeckCard.new(:card => card)
    end
  end
end