งานเรคของ Rails ให้การเข้าถึงกับรุ่น ActiveRecord หรือไม่?


235

ฉันพยายามสร้างงานเรคที่กำหนดเอง แต่ดูเหมือนว่าฉันไม่สามารถเข้าถึงโมเดลของฉันได้ ฉันคิดว่านี่เป็นสิ่งที่รวมอยู่ในงานทางรถไฟโดยปริยาย

ฉันมีรหัสต่อไปนี้ใน lib / task / 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 ไม่ได้ช่วยอะไร
Scott Coates

12
@scoarescoare: สภาพแวดล้อมที่นี่เป็นการอ้างอิงดังนั้นเมื่อทำงานnew_taskให้โหลดสภาพแวดล้อม (โหลดแบบจำลองของคุณ) ก่อนแล้วจึงเรียกใช้ new_task
bigpotato

3
@scoarescoare คุณสามารถตรวจสอบเอกสาร rake ที่กำหนดเองตัวอย่างแรกจะบอกคุณ
lazybios

วิธีการบรรลุสิ่งเดียวกันใน Sinatra
AMBasra

ชื่อรุ่นจะต้องติดตามด้วยทั้งหมดและมันใช้งานไม่ได้ถ้าไม่มี TodoList.all.each ไม่ใช่ TodoList.each idk ทำไมดูเหมือนว่ามันใช้งานได้?
Kick Buttowski

17

คุณอาจจำเป็นต้องมีการกำหนดค่าของคุณ (ซึ่งควรระบุรุ่นที่คุณต้องการและอื่น ๆ ทั้งหมด)

เช่น:

require 'config/environment'

อีกทางเลือกหนึ่งคุณอาจต้องการแยกกัน แต่คุณอาจมีปัญหาสภาพแวดล้อม AR ไม่ได้ตั้งค่า ฯลฯ )


5
มันจะใช้งานได้ แต่มันจะทำให้เขี่ยทั่วไป! หลังจากเพิ่มการเปลี่ยนแปลงนี้ลอง rake -T โดยไม่มีฐานข้อมูล rake - T อย่างมีความสุขควรให้รายชื่อของงานเรคโดยไม่จำเป็นต้องเข้าถึงฐานข้อมูล!
irkenInvader

1
หลังจากทำเช่นนี้คุณจะพบว่างาน rake อื่น ๆ ที่ต้องการเริ่มต้นแอปพลิเคชัน (เช่น rake assets: precompile) จะล้มเหลวด้วย "rake ถูกยกเลิก! Application ได้เริ่มต้นแล้ว"
รนต์

11

เมื่อคุณเริ่มเขียนเรภารกิจของคุณให้ใช้เครื่องกำเนิดไฟฟ้าเพื่อทำการสเก๊ตให้กับคุณ

ตัวอย่างเช่น:

rails g task my_tasks task_one task_two task_three 

คุณจะได้ต้นขั้วสร้างขึ้นใน lib / งานที่เรียกว่าmy_tasks.rake(เห็นได้ชัดว่าใช้ namespace ของคุณเอง) ซึ่งจะมีลักษณะเช่นนี้:

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

ทุกรุ่นของคุณ rails จะพร้อมใช้งานสำหรับสภาพแวดล้อมปัจจุบันจากภายในแต่ละ task task ยกเว้นว่าคุณใช้สภาพแวดล้อมการผลิตซึ่งในกรณีนี้คุณจำเป็นต้องใช้โมเดลเฉพาะที่คุณต้องการใช้ ทำสิ่งนี้ภายในร่างกายของงาน (IIRC อาจแตกต่างกันไปตามรุ่นของ Rails)


2
คุณไม่สามารถพูดได้ว่าenvironmentมันเป็นสิ่งที่ต้องพึ่งพาและจากนั้นพูดไวยากรณ์แทนที่จะสนับสนุน OP ให้พึ่งพายูทิลิตี้ "magic" ที่ไม่ได้ใช้เวทย์มนตร์?
BalinKingOfMoria กลับสู่สถานะเดิม CMs

3

ด้วยไวยากรณ์ ruby ​​hash ใหม่ (Ruby 1.9) สภาวะแวดล้อมจะถูกเพิ่มเช่นนี้ในภารกิจ rake:

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

2

The: การพึ่งพาสภาพแวดล้อมนั้นถูกเรียกออกมาอย่างถูกต้อง แต่คราดยังอาจไม่รู้เกี่ยวกับอัญมณีอื่น ๆ ที่แบบจำลองของคุณขึ้นอยู่กับ - ในกรณีหนึ่งของฉัน 'protected_attributes'

คำตอบคือให้ทำงาน:

bundle exec rake test:new_task

สิ่งนี้รับประกันว่าสภาพแวดล้อมจะรวมถึงอัญมณีใด ๆ ที่ระบุใน Gemfile ของคุณ


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.