2014-05-06 5 views
6

मैं रेल 4.1.0 का उपयोग करके एक साधारण ऐप लिख रहा हूं। मैंने सेरी और इवेंट नामक दो मॉडल बनाए, जिनमें से एक के बीच कई रिश्तों के साथ (जैसा कि एक सेरी में कई घटनाएं हैं)।गलत विदेशी कुंजी के साथ रेल लोडिंग पोर्ट

class Serie < ActiveRecord::Base 
    has_many :events 
end 

class Event < ActiveRecord::Base 
    belongs_to :serie 
end 

मैं इन मॉडलों के लिए निम्नलिखित स्थिरता फ़ाइलें बनाई:

#series.yml 
--- 
Serie1: 
    name: Whatever 

#events.yml  
--- 
EventSerie11: 
    date: 2013-01-01 
    value: '124.4' 
    serie: Serie1 
EventSerie12: 
    date: 2013-02-01 
    value: '124.2' 
    serie: Serie1 

समस्या यह है कि जब मैं rake db:fixtures:load का उपयोग करके इन जुड़नार लोड, मैं घटना वस्तुओं के लिए गलत foreing कुंजी मिलता है:

$ rails c 
Loading development environment (Rails 4.1.0) 
2.1.1 :001 > Serie.first.id 
    Serie Load (0.2ms) SELECT "series".* FROM "series" ORDER BY "series"."id" ASC LIMIT 1 
=> 10 
2.1.1 :002 > Serie.first.events.count 
    Serie Load (0.3ms) SELECT "series".* FROM "series" ORDER BY "series"."id" ASC LIMIT 1 
    (0.2ms) SELECT COUNT(*) FROM "events" WHERE "events"."serie_id" = ? [["serie_id", 10]] 
=> 0 
2.1.1 :003 > Event.first.serie 
    Evento Load (0.2ms) SELECT "events".* FROM "events" ORDER BY "events"."id" ASC LIMIT 1 
    Serie Load (0.3ms) SELECT "series".* FROM "series" WHERE "series"."id" = ? LIMIT 1 [["id", 627975337]] 
=> nil 
2.1.1 :004 > Evento.first.serie_id 
    Evento Load (0.4ms) SELECT "eventos".* FROM "eventos" ORDER BY "eventos"."id" ASC LIMIT 1 
=> 627975337 

तो आप देखते हैं कि सभी फिक्स्चर लोड हो रहे हैं, लेकिन ईवेंट रिकॉर्ड को गलत Serie_id विदेशी कुंजी असाइन की जा रही है (और जब से मैं विकास के लिए स्क्लाइट का उपयोग कर रहा हूं ent कोई बाधा जांच नहीं है)। जहां तक ​​मैं कह सकता हूं, प्रत्येक बार जब मैं डेटाबेस को रीसेट करता हूं और फिक्स्चर लोड करता हूं, तो सेरी रिकॉर्ड एक नई आईडी प्राप्त करता है, लेकिन प्रत्येक इवेंट रिकॉर्ड का सेरी_आईडी फ़ील्ड हमेशा 627975337 पर सेट होता है।

मैंने here पढ़ा है जिसे आप पढ़ सकते हैं अपने फिक्स्चर के लिए लोड ऑर्डर निर्दिष्ट करें; हालांकि मेरी environment.rb फाइल करने के लिए लाइन

ENV["FIXTURES"] ||= "series,events" 

जोड़ने काम नहीं किया, न ही

rake db:fixtures:load FIXTURES=series,events 

कोई भी विचार चल रहा था?

उत्तर

4

मुझे लगता है कि series के लिए रेल आपके फिक्स्चर नाम के साथ एक गड़बड़ी में हो रही है। यह Series नामक मॉडल श्रेणी की तलाश करने की कोशिश करता है क्योंकि यह आपके बहुवचन नाम को एकवचन करने के लिए संघर्ष करता है। (श्रृंखला अंग्रेजी में एक शब्द है जहां बहुवचन एकवचन के समान है)।

मुझे दृढ़ता से संदेह है कि आपके डेटाबेस में Serie उदाहरण आपके स्थिरता लोड के साथ कुछ भी नहीं है और इसके बजाय एक उदाहरण है जो किसी अन्य विधि के माध्यम से बनाया गया है।

serie_id आपके ईवेंट फिक्स्चर में उपयोग किया जाता है। आईडी जिसका प्रयोग किया जाता है का उपयोग कर की जाती है:

> ActiveRecord::FixtureSet.identify(:Serie1) 
=> 627975337 

जो आप देख सकते हैं अपने जुड़नार में इस्तेमाल मान के समान है।

तो, एक समाधान, आप या तो सक्रिय रिकॉर्ड के आंतों में आ सकते हैं और फिक्स्चर लोड करने वाले रेक कार्य को ओवरराइड कर सकते हैं - या आप "सेरी"/"श्रृंखला" के अपने एकवचन/बहुवचन संस्करणों को परिभाषित कर सकते हैं रेलवे अनुमान लगाने के बजाय चाहते हैं। config/application.rb या एक प्रारंभकर्ता जो आप जोड़ सकते हैं:

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.irregular 'serie', 'series' 
end 
+2

आप, महोदय, एक सज्जन और विद्वान हैं। यहां, कुछ और प्रतिष्ठा है। – ailnlv

संबंधित मुद्दे