2009-03-06 7 views
1

私はRailsを学ぶためにカードゲームをモデル化しようとしています。これは、デッキにカードの複数のコピーがあるという点で、トランプの標準デッキとは異なります。デッキの初期化中に問題が発生しています。これまでは、さまざまな属性を持つ基本的なCardモデル(copies_in_deckなど)を持っていましたが、関連はありませんでした。デッキのカードを(これがデッキに同じカードの倍数を有することに起因する)を表すDeckCardモデル:レールでカードのカスタムデッキをモデル化して作成する方法は?

class DeckCard < ActiveRecord::Base 
    belongs_to :card 
    belongs_to :deck 
end 

これらDeckCards最終的位置を反映した属性を持っています。 、捨て山のような山札で、など

belongs_to :game 
has_many :deck_cards 

とデッキモデル私はデッキをinializeしようとしていると、様々な問題を抱えています。私はDeck.newを行うと、私はnil.build上のエラーを取得し

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_cardsはnilですか?

私はInstant Rail 2を使用しています。これには、レール2.0.2があります。私はthis articleが1つのアクションで複数のモデルを作成することを発見したので、Deck.createを使ってみました!代わりに、引数の数が間違っているというエラーが発生しました。

提案がありますか?

答えて

1
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 
+0

ありがとうございました!私はそれをマークアップしただろうが、私は担当者を持っていない – user26270

1

ActiveRecordのサブクラスは、ActiveRecordがそれを処理するので、initializeメソッドを定義すべきではありません。

カードごとに1つのレコードが必要なような音がします。また、Model DeckCardは一度に複数のカードパックを保持できます。

Re:なぜ@deck_cardsはnilですか? どこにも設定していないためです。

@deck_cardsはインスタンス変数です。ビルドメソッドを呼び出そうとしていますが、何も設定していません。クラスDeckCardでビルド(または作成または新しいメソッド)を呼び出す必要があります。

あなたはDeckCardモデルでカードを作成し、保存したい場合:
DeckCard.create(カード)#ないdeck_cards.build @(カード)

ラリー

+0

私は@deck_cardsが自己と同じだと思ったと思います。deck_cards;私は、関連やアソシエーションのプロキシについて読んだことからビルドを手に入れました(そこには適切な用語がないかもしれません) – user26270

0

#initializeを使用しないでくださいActiveRecord :: Baseから継承したオブジェクト上に存在します。あらゆる種類の内部的なRailsの魔法を壊すでしょう。代わりに#after_initializeコールバックを使用してください:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

after_initializeは新しく作成されたオブジェクトと同様に検出された後に呼び出されるため、初期化コードをラップしてそのオブジェクトが以前に保存した(使用#new_record?):過去には

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