मैं रूबी कार्यों को कैसे चला सकता हूं जो मेरे रेल मॉडल का उपयोग करते हैं?

मेरे पास कुछ बुनियादी मॉडल के साथ एक रेल ऐप है। वेबसाइट अन्य स्रोतों से प्राप्त डेटा प्रदर्शित करती है। इसलिए मुझे रूबी लिपि लिखनी है जो मेरे डेटाबेस में नए उदाहरण बनाता है। मुझे पता है कि मैं परीक्षण हुक के साथ ऐसा कर सकता हूं, लेकिन मुझे यकीन नहीं है कि यहां समझ में आता है।

मुझे यकीन नहीं है कि यह कार्य किस तरह दिखना चाहिए, मैं इसे कैसे कह सकता हूं, या इसे मेरे स्रोत पेड़ (lib \ actions?) में कहां जाना चाहिए।

उदाहरण के लिए, मेरा पहला प्रयास यहां है:

require 'active_record'
require '../app/models/mymodel.rb'

test = MyModel.new
test.name = 'test'
test.save

यह विफल रहता है क्योंकि यह डेटाबेस से कनेक्शन नहीं प्राप्त कर सकता है। यह मेरी नौसिखिया मस्तिष्क के अस्पष्ट तरीके से समझ में आता है, क्योंकि संभवतः रेल सभी चीजों को सेट करने के लिए दृश्यों के पीछे सभी जादू कार्य कर रहा है। तो मैं अपनी छोटी लिपि कैसे स्थापित करूं?

0

9 उत्तर

आप अपनी स्क्रिप्ट में एक कनेक्शन खोल सकते हैं जैसे:

ActiveRecord::Base.establish_connection(
    :adapter  => "mysql",
    :username => "root",
    :host     => "localhost",
    :password => "******",
    :database => "******" 
)

मुझे यकीन है कि ऐसा करने के लिए एक और शानदार तरीका है, ताकि यह आपके डेटाबेस से जानकारी प्राप्त कर सके।

0
जोड़ा

आप पर्यावरण की आवश्यकता के जरिए किसी भी रूबी स्क्रिप्ट में पूरे रेल पर्यावरण को लोड कर सकते हैं। आरबी:

require "#{ENV['RAILS_ROOT']}/config/environment" 

यह मानता है कि RAILS_ROOT पर्यावरण चर सेट है, ऐसा करने के अन्य तरीकों के लिए मेरी टिप्पणी देखें।

इसमें आपके सभी रेलवे कोडों में आपके सभी अच्छे वर्ग और ऑब्जेक्ट्स देने का अतिरिक्त बोनस है।

अपनी प्रक्रियाओं को दूर करने के लिए ऐसा लगता है जैसे क्रॉन आपके इच्छित काम करेगा, और मैं आपके कैपिस्ट्रानो रेसिपी में भी एक कार्य जोड़ूंगा जो आपके स्क्रिप्ट को क्रॉन्टाब में समय-समय पर बाहरी स्रोत से डेटा प्राप्त करने और आपके डीबी को अपडेट करने के लिए जोड़ देगा। यह आसानी से cronedit मणि के साथ किया जा सकता है।

अन्य अधिक परिष्कृत विकल्पों के लिए क्रॉन दृष्टिकोण में कुछ कमियां होती हैं, अधिकतर ओवरहेड और नियंत्रण होती है, HowToRunBackgroundJobsInRails रेल विकी से।

0
जोड़ा
आपको एहसास है कि RAILS_ROOT को तब तक परिभाषित नहीं किया गया है जब तक पर्यावरण। आरबी पहले ही लोड हो चुका है? :-)
जोड़ा लेखक Orion Edwards, स्रोत
ओरियन बहुत सही है। तो मैंने पर्यावरण चर के लिए उपरोक्त संपादित किया। आप "# {File.dirname ( FILE )}/path/to/env" के साथ एक पूर्ण पथ भी प्रदान कर सकते हैं या अपनी स्क्रिप्ट के सापेक्ष एक का उपयोग कर सकते हैं।
जोड़ा लेखक csexton, स्रोत

मैंने थोड़ी देर पहले इस बारे में एक पोस्ट लिखा था।

http://www.rawblock.com/2007/06/14/ruby-oracle-mac-os-x-pain-jruby-and-activerecord-jdbc-to-the-rescue/

0
जोड़ा

इसके लिए कुछ कदम हैं और वास्तव में अच्छी तरह उत्तर देने के लिए आवश्यक अधिक जानकारी हैं।

आप कहते हैं कि आपकी साइट अन्य स्रोतों से डेटा पुनर्प्राप्त करती है? कितनी बार? यदि यह अर्द्ध नियमित रूप से है तो आप निश्चित रूप से पृष्ठभूमि प्रसंस्करण/संदेश में देखना चाहते हैं। यदि यह अक्सर होता है तो आप वास्तव में अपनी रैली चलाने के दौरान अपने रेल पर्यावरण को लोड करना टालना चाहते हैं क्योंकि आप हर बार स्टार्टअप टैक्स का भुगतान करेंगे।

वहाँ बहुत सारे विकल्प हैं जहां आप शोध करना चाहते हैं। उनमें से प्रत्येक के बारे में पढ़ना, विशेष रूप से उन लोगों की समीक्षा जो पोस्ट करते हैं कि उन्होंने अपनी पसंद क्यों की, उन्होंने आपको अपनी पसंद से पहले खुद से पूछने के लिए क्या प्रश्न पूछने के लिए एक अच्छा अनुभव दिया। डेटा कितना बड़ा डेटा लोड कर रहा है? आदि...

मेरे सिर के ऊपर से ये कुछ चीजें हैं जिन्हें आप देखना चाहते हैं

Script/Runner & Cron Background/RB Starling Workling MemcacheQ Beanstalk Background Job (Bj) delayed_job (Dj) Daemon Generator

0
जोड़ा

" रेल के लिए एक क्रॉन नौकरी: सर्वोत्तम प्रथाओं में मेरा उत्तर देखें? "।

इसमें रेक कार्य और कक्षा विधियों को चलाने के लिए क्रॉन का उपयोग करने के लिए दो उदाहरण हैं ( script/runner के माध्यम से)। दोनों मामलों में, रेल लोड हो जाती है और आप अपने मॉडल का उपयोग कर सकते हैं।

0
जोड़ा
धन्यवाद .... यह वह पोस्ट नहीं था जिसे मैं ढूंढ रहा था लेकिन आपके समाधान ने मेरे लिए नई संभावनाएं खोलीं ...: डी
जोड़ा लेखक Anto Dominic, स्रोत

मैं कस्टम रेक कार्यों (lib/task/foo.rake) बनाने का सुझाव देना चाहता हूं। यह आपको अपने रेल ऐप की अधिकांश कार्यक्षमताओं तक आसान पहुंच प्रदान करता है।

namespace :foo do
  desc 'do something cool'
  def something_cool
     test = MyModel.new
     test.name = 'test'
     test.save
  end
end

फिर:

$ rake -T foo
rake foo:something_cool       # do something cool

आप एक cronjob के माध्यम से भी काम चला सकते हैं।

0
जोड़ा

I agree with the answer above but you have to include => :environment in your task or it will not load the Rails environment.

उदाहरण के लिए,

namespace :send do
  namespace :trial do
    namespace :expiry do
      desc "Sends out emails to people who's accounts are about to expire"
      task :warnings => :environment do
        User.trial_about_to_expire.has_not_been_notified_of_trial_expiry.each do |user|
          UserMailer.deliver_trial_expiring_warning(user)
          user.notified_of_trial_expiry = true
          user.save
        end
      end
    end
  end
end
0
जोड़ा

Nice Joyent write up of using rake to run rails tasks from a cron job - http://wiki.joyent.com/accelerators:kb:rails:cron

0
जोड़ा

रेल ऐप/मॉडलों के साथ बातचीत करने वाले रूबी कार्यों को चलाने का सबसे आसान तरीका रेल को आपके लिए रेक कार्य उत्पन्न करना है !! :)

यहां एक उदाहरण दिया गया है

  1. चलाएं <कोड> रेल जी कार्य my_namespace my_task

  2. यह lib/functions/my_namespace.rake नामक फ़ाइल उत्पन्न करेगा जो इस तरह दिखता है:

namespace :my_namespace do
desc "TODO: Describe your task here"
  task :my_task1 => :environment do
    #write any ruby code here and also work with your models
    puts User.find(1).name
  end
end
  1. इस कार्य को rake my_namespace के साथ चलाएं: my_task

  2. अपने रूबी कोड कार्य को देखें जो रेल मोडल रन के साथ इंटरैक्ट करता है!

0
जोड़ा