2011-01-27 7 views
15

मेरे पास रेल एप्लिकेशन है जो एकाधिक डेटाबेस से जुड़ता है।एक लूप में एक रेक कार्य केवल एक बार निष्पादित क्यों करता है?

task :migrate_accounts_schema => [:environment] do |t| 
    users = User.find :all, :conditions => ["state = 2"], :order => "id asc" 
    users.each do |user|    
    if user.state == 2 
     ActiveRecord::Base.establish_connection(
     :adapter => "postgresql", 
     :host  => user.database_host, 
     :port  => user.database_port, 
     :username => user.subdomain, 
     :password => "#{user.database_password}", 
     :database => user.database_name 
    ) 
     Rake::Task["db:migrate"].invoke 
    end 
    end 
end 

समस्या यह है कि कार्य कार्यान्वित db है: मैं कस्टम रेक कार्य है कि इस तरह दिखता है लिखा केवल उन [0] उपयोगकर्ता (संग्रह में पहले उपयोगकर्ता) के लिए विस्थापित करने और कोई त्रुटि नहीं है, बस चुपचाप stoppes .. ।

यहाँ --trace

** Invoke app:migrate_accounts_schema (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Execute app:migrate_accounts_schema  
** Invoke db:migrate (first_time) 
** Invoke environment 
** Execute db:migrate 
** Invoke db:schema:dump (first_time) 
** Invoke environment 
** Execute db:schema:dump 
** Invoke db:migrate 

रेक से उत्पादन मुझे पता नहीं क्यों शेष उपयोगकर्ताओं के लिए चले गए नहीं मिलता है है।

उत्तर

17

मैं सटीक आंतरिक भूल गया लेकिन जिस तरह से रेक काम करता है वह यह है कि invoke केवल प्रत्येक कार्य को निष्पादित करेगा यदि इसे (दूसरे शब्दों में) की आवश्यकता हो।

आगामी कॉल पर अमल कॉल करके देखें:

Rake::Task["db:migrate"].execute

लूप के माध्यम से पहली बार जब आप invoke की आवश्यकता होगी के रूप में यह आवश्यक शर्तें पहले invokes।

+0

चेक स्रोत [यहां] (http://rake.rubyforge.org/classes/Rake/Task.html) – lebreeze

+0

यह काम किया :) धन्यवाद के :) –

+2

यह मेरे लिए बहुत जवाबी सहज लगता है। कोई विचार है कि उन्होंने इसे ऐसा क्यों बनाया? – marcovtwout

18

मैं रैक स्रोत में जवाब मिला:

http://rake.rubyforge.org/classes/Rake/Task.html#M000115

इसे कहते हैं आप

पुन: सक्षम काम करने के लिए है कि, की अनुमति देता है, तो कार्य फिर से शुरू हो जाती है अपने कार्य निष्पादित किया जाना है।

उदा।

# db/seed.rb 
Rake::Task['catalog:destroy'].invoke 

files = Dir.glob("private/catalog/*").sort 
files.each do |file| 
    next unless File.extname(file) == '.xlsx' 
    puts file.split('/').last 
    Rake::Task['catalog:upload'].invoke(file) 
    Rake::Task['catalog:upload'].reenable 
    puts 
end 

तो मैं रेक सूची चलाएँ:: हर पाश अपलोड करें [some_file] मैं इस तरह से अपने प्रोजेक्ट पर हाल ही में इस का इस्तेमाल किया।

उम्मीद है कि इससे मदद मिलती है। भी देखें https://stackoverflow.com/a/1290119/3082929

+0

मुझे पूरा यकीन है कि यह तकनीकी रूप से सही उत्तर है ('# reenable', न केवल' # execute') –

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