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

gmoniey
sumber

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

gmoniey
sumber
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)

Luke Schafer
sumber
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.)

ocodo
sumber
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
apadana
sumber
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.

Lex Lindsey
sumber
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
Ni3
sumber