레일 레이크 작업이 ActiveRecord 모델에 대한 액세스를 제공합니까?


235

사용자 정의 레이크 작업을 만들려고하는데 모델에 액세스 할 수없는 것 같습니다. 나는 이것이 레일 작업에 암시 적으로 포함 된 것이라고 생각했습니다.

lib / tasks / 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얼마입니까? 구글은 도움이되지 않습니다.
Scott Coates

12
@scoarescoare : environment는 의존성이므로을 실행할 때 new_task환경을로드 (모델로드) 한 다음 new_task를 실행하십시오.
bigpotato

3
@ scoarescoare 당신은 사용자 정의 레이크 문서를 확인할 수 있습니다 , 첫 번째 예는 당신에게 말할 것이다
lazybios

Sinatra에서 동일한 것을 달성하는 방법?
AMBasra

모델 이름은 모두 따라야하며 TodoList.all.each not todoList.each idk와 같이 작동하지 않는 이유는 무엇입니까?
Kick Buttowski

17

구성이 필요할 수 있습니다 (필수 모델 모두 지정해야 함).

예 :

require 'config/environment'

또는 별도로 별도로 필요하지만 환경 문제 AR이 설정되지 않은 경우 등)


5
이것은 작동하지만 일반적으로 레이크를 깰 것입니다! 이 변경 사항을 추가 한 후 사용 가능한 DB없이 rake -T를 시도하십시오. rake -T는 DB에 액세스 할 필요없이 레이크 작업 목록을 행복하게 제공해야합니다!
irkenInvader

1
이렇게하면 응용 프로그램을 초기화해야하는 다른 레이크 작업 (예 : rake asset : precompile)이 "rake aborted! 응용 프로그램이 이미 초기화되었습니다"라는 메시지가 표시됩니다.
brent

11

레이크 작업 작성을 시작할 때 생성기를 사용하여 스텁을 제거하십시오.

예를 들면 다음과 같습니다.

rails g task my_tasks task_one task_two task_three 

lib / tasks라는 스텁 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

새로운 루비 해시 구문 (Ruby 1.9)을 사용하면 다음과 같은 환경이 레이크 작업에 추가됩니다.

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

2

: environment 의존성은 꽤 정확하게 호출되지만, 레이크는 모델이 의존하는 다른 gem에 대해서는 여전히 알지 못할 수도 있습니다-내 경우에는 '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.