क्या रैक रेक कार्य ActiveRecord मॉडल तक पहुँच प्रदान करते हैं?


235

मैं एक कस्टम रेक कार्य बनाने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि मेरे पास मेरे मॉडल तक पहुंच नहीं है। मैंने सोचा कि यह कुछ स्पष्ट रूप से रेल कार्य के साथ शामिल था।

मेरे पास lib / कार्य / test.rake में निम्नलिखित कोड हैं:

namespace :test do
  task :new_task do
    puts Parent.all.inspect
  end
end

और यहाँ मेरा मूल मॉडल कैसा दिखता है:

class Parent < ActiveRecord::Base
  has_many :children
end

यह एक बहुत ही सरल उदाहरण है, लेकिन मुझे निम्नलिखित त्रुटि मिलती है:

/> rake test:new_task
(in /Users/arash/Documents/dev/soft_deletes)
rake aborted!
uninitialized constant Parent

(See full trace by running task with --trace)

कोई विचार? धन्यवाद

जवाबों:


410

यह पता लगाया, कार्य की तरह दिखना चाहिए:

namespace :test do
  task :new_task => :environment do
    puts Parent.all.inspect
  end
end

=> :environmentकार्य में जोड़े गए निर्भरता पर ध्यान दें


4
इस वाक्यविन्यास का क्या अर्थ है? यह new_taskवर्तमान परिवेश को निर्दिष्ट कर रहा है? वर्तमान मूल्य क्या है :environment? Google मदद नहीं कर रहा है।
स्कॉट Coates

12
@scoarescoare: यहां का वातावरण निर्भरता है, इसलिए दौड़ते समय new_task, पहले पर्यावरण को लोड करें (अपने मॉडल को लोड करें), और फिर new_task चलाएं।
१६

3
@scoarescoare आप कस्टम रेक डॉक्टर की जांच कर सकते हैं , पहला उदाहरण आपको बताएगा
lazybios

सिनात्रा में एक ही चीज कैसे प्राप्त की जाए?
अंबासरा

मॉडल का नाम सभी के साथ पालन करना है और यह उसके बिना काम नहीं करता है जैसे कि TodoList.all.each नहीं TodoList.each idk यह काम क्यों लगता है?
किक बटशकी

17

आपको अपने कॉन्फ़िगरेशन (जो आपके सभी आवश्यक मॉडल आदि को निर्दिष्ट करना चाहिए) की आवश्यकता हो सकती है

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

require 'config/environment'

वैकल्पिक रूप से आपको बस प्रत्येक अलग की आवश्यकता हो सकती है, लेकिन आपके पास पर्यावरण के मुद्दे हो सकते हैं, एआर सेट नहीं किए गए आदि)


5
यह काम करेगा, लेकिन यह सामान्य रूप से रेक को तोड़ देगा! इस बदलाव को जोड़ने के बाद, बिना डीबी उपलब्ध रेक-टी की कोशिश करें। rake -T को खुशी के साथ DB तक पहुँच की आवश्यकता के बिना रेक कार्यों की एक सूची प्रदान करनी चाहिए!
irkenInvader

1
ऐसा करने के बाद आप पाएंगे कि किसी भी अन्य रेक कार्य के लिए आवेदन को शुरू करने की आवश्यकता है (यानी रेक संपत्ति: precompile) "रेक निरस्त" के साथ विफल हो जाएगा! आवेदन पहले से ही आरंभिक हो चुका है "।
ब्रेंट

11

जब आप अपने रेक कार्य लिखना शुरू करते हैं, तो उन्हें बाहर निकालने के लिए एक जनरेटर का उपयोग करें।

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

rails g task my_tasks task_one task_two task_three 

आपको lib / कार्यों में बनाया गया एक स्टब मिलेगा, जिसे my_tasks.rake(स्पष्ट रूप से अपने स्वयं के नामस्थान का उपयोग करें।) जो इस तरह दिखेगा:

namespace :my_tasks do

  desc "TODO"
  task :task_one => :environment do 
  end  

  desc "TODO"
  task :task_two => :environment do 
  end  

  desc "TODO"
  task :task_three => :environment do 
  end  

end

आपके सभी रेल मॉडल आदि प्रत्येक कार्य ब्लॉक के भीतर से वर्तमान परिवेश के लिए उपलब्ध होंगे, जब तक कि आप उत्पादन वातावरण का उपयोग नहीं कर रहे हों , उस स्थिति में आपको उन विशिष्ट मॉडलों की आवश्यकता होती है जिन्हें आप उपयोग करना चाहते हैं। यह कार्य शरीर के भीतर करें। (IIRC रेल के विभिन्न संस्करणों के बीच भिन्न होता है।)


2
क्या आप सिर्फ यह नहीं कह सकते हैं कि environmentएक निर्भरता के रूप में आवश्यक है और फिर ओपी को प्रोत्साहित करने के बजाय "जादू" उपयोगिताओं पर भरोसा करने के लिए वाक्यविन्यास कहें जो किसी भी जादू का उपयोग नहीं करते हैं?
BalinKingOfMoria CM

3

नए रूबी हैश सिंटैक्स (रूबी 1.9) के साथ पर्यावरण को रेक कार्य में इस तरह जोड़ा जाएगा:

namespace :test do
  task new_task: :environment do
    puts Parent.all.inspect
  end
end

2

: पर्यावरण पर निर्भरता को सही ढंग से कहा जाता है, लेकिन रेक अभी भी अन्य रत्नों के बारे में नहीं जान सकता है जो आपके मॉडल पर निर्भर करते हैं - एक मामले में, मेरा 'रक्षित_अवशेष'।

उत्तर चलाना है:

bundle exec rake test:new_task

यह गारंटी देता है कि पर्यावरण में आपके जेमफाइल में निर्दिष्ट कोई भी रत्न शामिल है।


1

नीचे दिए गए कमांड का उपयोग करके कार्य उत्पन्न करें (कार्य नाम के साथ नाम स्थान):

rails g task test new_task

तर्क जोड़ने के लिए सिंटैक्स का उपयोग करें:

namespace :test do
  desc 'Test new task'
  task new_task: :environment do
    puts Parent.all.inspect
  end
end

नीचे दिए गए कमांड का उपयोग करके कार्य को चलाएं:

bundle exec rake test:new_task  

या

 rake test:new_task
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.