Các tác vụ cào cào có cung cấp quyền truy cập vào các mô hình ActiveRecord không?


235

Tôi đang cố gắng tạo một tác vụ cào tùy chỉnh, nhưng có vẻ như tôi không có quyền truy cập vào các mô hình của mình. Tôi nghĩ rằng đây là một cái gì đó ngầm bao gồm với nhiệm vụ rails.

Tôi có đoạn mã sau trong lib / task / test.rake:

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

Và đây là mô hình cha mẹ của tôi trông như thế nào:

class Parent < ActiveRecord::Base
  has_many :children
end

Đây là một ví dụ khá đơn giản, nhưng tôi gặp phải lỗi sau:

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

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

Có ý kiến ​​gì không? Cảm ơn

Câu trả lời:


410

Tìm ra nó, nhiệm vụ sẽ giống như:

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

Lưu ý sự => :environmentphụ thuộc được thêm vào nhiệm vụ


4
cú pháp này có nghĩa là gì? nó đang gán new_taskcho môi trường hiện tại? giá trị hiện tại là :environmentgì? google không giúp được gì
Scott Coates

12
@scoarescoare: môi trường ở đây là sự phụ thuộc, vì vậy khi chạy new_task, hãy tải môi trường (tải mô hình của bạn) trước, sau đó chạy new_task.
bigpotato

3
@scoarescoare bạn có thể kiểm tra tài liệu cào tùy chỉnh , ví dụ đầu tiên sẽ cho bạn biết
lazybios

Làm thế nào để đạt được điều tương tự ở Sinatra?
AMBasra

Tên mô hình phải tuân theo tất cả và nó không hoạt động mà không có nó như TodoList.all.each không phải TodoList.each idk tại sao nó có vẻ hoạt động?
Kick Buttowski

17

bạn có thể cần phải yêu cầu cấu hình của mình (sẽ chỉ định tất cả các mô hình được yêu cầu của bạn, v.v.)

ví dụ:

require 'config/environment'

cách khác, bạn chỉ có thể yêu cầu từng phần riêng biệt, nhưng bạn có thể gặp sự cố môi trường AR không được thiết lập, v.v.)


5
Điều này sẽ làm việc, nhưng nó sẽ phá vỡ cào nói chung! Sau khi thêm thay đổi này, hãy thử rake -T mà không có DB. rake -T vui vẻ cung cấp một danh sách các nhiệm vụ cào mà không cần truy cập vào DB!
irkenInvader

1
Sau khi làm điều này, bạn sẽ thấy rằng bất kỳ tác vụ cào nào khác yêu cầu khởi tạo ứng dụng (ví dụ: tài sản cào: tiền biên dịch) sẽ không thành công với "cào bị hủy bỏ! Ứng dụng đã được khởi tạo".
brent

11

Khi bạn bắt đầu viết các tác vụ cào , hãy sử dụng một trình tạo để loại bỏ chúng cho bạn.

Ví dụ:

rails g task my_tasks task_one task_two task_three 

Bạn sẽ nhận được một sơ khai được tạo trong lib / tác vụ được gọi my_tasks.rake(rõ ràng sử dụng không gian tên của riêng bạn.) Sẽ giống như thế này:

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

Tất cả các mô hình đường ray của bạn, v.v. sẽ có sẵn cho môi trường hiện tại từ trong mỗi khối nhiệm vụ, trừ khi bạn đang sử dụng môi trường sản xuất , trong trường hợp đó bạn cần phải yêu cầu các mô hình cụ thể mà bạn muốn sử dụng. Làm điều này trong cơ thể của nhiệm vụ. (IIRC này thay đổi giữa các phiên bản khác nhau của Rails.)


2
Bạn không thể nói rằng điều đó environmentlà bắt buộc như là một sự phụ thuộc và sau đó nói cú pháp chứ không phải khuyến khích OP dựa vào các tiện ích "ma thuật" thậm chí không sử dụng bất kỳ phép thuật nào?
BalinKingOfMoria Tái lập CM

3

Với cú pháp băm ruby ​​mới (Ruby 1.9), môi trường sẽ được thêm như thế này vào tác vụ cào:

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

2

Sự phụ thuộc môi trường được gọi khá chính xác, nhưng cào vẫn có thể không biết về các loại đá quý khác mà mô hình của bạn phụ thuộc - trong một trường hợp của tôi, 'bảo vệ_attribut'.

Câu trả lời là chạy:

bundle exec rake test:new_task

Điều này đảm bảo rằng môi trường bao gồm bất kỳ đá quý nào được chỉ định trong Gemfile của bạn.


1

Tạo tác vụ bằng cách sử dụng lệnh bên dưới (không gian tên với tên tác vụ):

rails g task test new_task

Sử dụng cú pháp dưới đây để thêm logic:

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

Chạy tác vụ trên bằng lệnh dưới đây:

bundle exec rake test:new_task  

hoặc là

 rake test:new_task
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.