2010-01-10 8 views
10

मुझे यकीन है कि यह एक बहुत ही सरल सवाल है, लेकिन मैं सिर्फ एक नौसिखिया तो हूँ ...रूबी ऑन रेल्स: बच्चे बनाना वस्तुओं

मैं एक मॉडल, खेल है, जो has_many :piles है। ढेर, बदले में, has_many :cards। मैं खेल के निर्माण पर बवासीर और कार्ड को भरने के लिए सक्षम हूँ, इसलिए वर्तमान में मेरे कोड लगता है कि कुछ:

class Game < ActiveRecord::Base 
    has_many :piles 

    def after_create 
    1.upto(4) do |num| 
     Pile.new("game_id" => id, "contents" => "c_type_#{num}") 
    end 
    end 
end 

class Pile < ActiveRecord::Base 
    has_many :cards 
    belongs_to :game 

    def after_create 
    1.upto(10) do |num| 
     Card.new("pile_id" => id, "value" => num) 
    end 
    end 
end 

class Card < ActiveRecord::Base 
    belongs_to :pile 
end 

अब यह सब बहुत अच्छी तरह से है, लेकिन यह जब "game_id" => id गुजर जा करने के लिए ActiveRecord गलत लगता है जानता है कि game_id विदेशी कुंजी है और इसे मूल गेम का संदर्भ लेना चाहिए। लेकिन अगर मैं इसे छोड़ देता हूं, तो विदेशी कुंजी अनसेट हो जाती है। क्या ऐसा करने के लिए इससे अच्छा तरीका है?

(एक बोनस के लिए, शायद सरल, प्रश्न, खेल भी लगता है has_one :monkey कैसे सबसे अच्छा मैं खेल मॉडल के भीतर से बंदर बना सकता हूँ।?)

उत्तर

14

के बजाय:

Pile.new("game_id" => id, "contents" => "c_type_#{num}") 

कोशिश:

piles.create("contents" => "c_type_#{num}") 

यह सीधे बनाए गए ढेर को बचाने की कोशिश करता है। या, आप वास्तव में की जरूरत है कि कोई भी बचत जगह (जो create के साथ मामला है) लेता है, तो आप कर सकते हैं:

new_pile = piles.build("contents" => "c_type_#{num}") 

ढेर वर्ग और उसके कार्ड के लिए इसी तरह की।

has_one :monkey का सवाल है, आप कर सकते हैं (खेल की एक विधि के भीतर से) के बाद:

create_monkey("some_attr" => "some_value") 
3

आपका Game वस्तु की piles संघ संग्रह सक्रिय रिकॉर्ड (create विधि भी द्वारा प्रदान की build और create तरीकों होगा संबंधित ऑब्जेक्ट को सहेजता है यह मानता है कि यह सत्यापन पास करता है)।

आप इस तरह कुछ करने के लिए सक्षम होना चाहिए:

def after_create 
    1.upto(4) do |num| 
    piles.create(:contents => "c_type_#{num}") 
    end 
end 
0

क्या अन्य लोगों ने कहा के अलावा, आप इस week's railscast को देखने पर विचार करना चाहिए - जो रेल 2.3 में विरासत में मिला संसाधनों के साथ सौदों, विशेष रूप से विचारों में।

भाग 2 अगले सोमवार (2010-01-18)

दिखाई देना चाहिए