Apakah tugas rel menyapu menyediakan akses ke model ActiveRecord?


235

Saya mencoba membuat tugas menyapu kustom, tetapi sepertinya saya tidak memiliki akses ke model saya. Saya pikir ini adalah sesuatu yang secara implisit termasuk dalam tugas rel.

Saya memiliki kode berikut di lib / task / test.rake:

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

Dan inilah model orang tua saya:

class Parent < ActiveRecord::Base
  has_many :children
end

Ini adalah contoh yang cukup sederhana, tetapi saya mendapatkan kesalahan berikut:

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

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

Ada ide? Terima kasih

Jawaban:


410

Memikirkannya, tugas harus terlihat seperti:

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

Perhatikan => :environmentketergantungan yang ditambahkan ke tugas


4
apa arti sintaksis ini? itu menugaskan new_taskke lingkungan saat ini? berapakah nilai saat ini :environment? google tidak membantu.
Scott Coates

12
@scoarescoare: lingkungan di sini adalah ketergantungan, jadi saat menjalankan new_task, muatkan lingkungan (muat model Anda) terlebih dahulu, kemudian jalankan new_task.
bigpotato

3
@scoarescoare Anda dapat memeriksa custom rake doc , contoh pertama akan memberi tahu Anda
lazybios

bagaimana cara mencapai hal yang sama di Sinatra?
AMBasra

nama model harus diikuti dengan semua dan tidak berfungsi tanpa itu seperti TodoList.all.each bukan TodoList.each idk mengapa tampaknya bekerja?
Kick Buttowski

17

Anda mungkin perlu memerlukan konfigurasi Anda (yang harus menentukan semua model yang diperlukan Anda, dll)

misalnya:

require 'config/environment'

atau Anda hanya dapat meminta masing-masing secara terpisah, tetapi Anda mungkin memiliki masalah lingkungan AR tidak diatur dll)


5
Ini akan berhasil, tetapi itu akan merusak rake secara umum! Setelah menambahkan perubahan ini, coba rake -T tanpa DB tersedia. rake -T harus dengan senang hati memberikan daftar tugas rake tanpa perlu akses ke DB!
irkenInvader

1
Setelah melakukan ini, Anda akan menemukan bahwa tugas rake lain yang memerlukan inisialisasi aplikasi (yaitu rake aset: precompile) akan gagal dengan "rake dibatalkan! Aplikasi telah diinisialisasi".
brent

11

Saat Anda mulai menulis tugas menyapu Anda , gunakan generator untuk mematikannya untuk Anda.

Sebagai contoh:

rails g task my_tasks task_one task_two task_three 

Anda akan mendapatkan tulisan rintisan yang dibuat di lib / tugas yang disebut my_tasks.rake(jelas menggunakan namespace Anda sendiri.) Yang akan terlihat seperti ini:

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

Semua model rel Anda, dll. Akan tersedia untuk lingkungan saat ini dari dalam setiap blok tugas, kecuali jika Anda menggunakan lingkungan produksi , dalam hal ini Anda perlu memerlukan model spesifik yang ingin Anda gunakan. Lakukan ini di dalam tubuh tugas. (IIRC ini bervariasi antara versi Rails yang berbeda.)


2
Tidak bisakah Anda hanya mengatakan bahwa environmentitu diperlukan sebagai ketergantungan dan kemudian mengatakan sintaks daripada mendorong OP untuk bergantung pada utilitas "sihir" yang bahkan tidak menggunakan sihir apa pun?
BalinKingOfMoria Reinstate CMs

3

Dengan sintaks hash ruby ​​baru (Ruby 1.9) lingkungan akan ditambahkan seperti ini ke tugas menyapu:

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

2

Ketergantungan lingkungan dipanggil dengan benar, tetapi rake masih belum tahu tentang permata lain yang menjadi sandaran model Anda - dalam satu kasus milik saya, 'protected_attributes'.

Jawabannya adalah menjalankan:

bundle exec rake test:new_task

Ini menjamin bahwa lingkungan menyertakan permata apa pun yang ditentukan dalam Gemfile Anda.


1

Hasilkan tugas menggunakan perintah di bawah ini (namespace dengan nama tugas):

rails g task test new_task

Gunakan sintaksis di bawah ini untuk menambahkan logika:

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

Jalankan tugas di atas menggunakan perintah di bawah ini:

bundle exec rake test:new_task  

atau

 rake test:new_task
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.