`rake db : seed`의 처리 흐름을 쫓았다.
3832 단어 rake루비RailsActiveRecord
개요
표제대로.
경위
Rails 앱으로 개발시 초기 투입하는 처리를
db/seeds.rb
에 썼다. 그 때, 특정의 환경하 이외에서는 동작하지 않게 이하와 같이 조기 return 하는 처리를 쓰고 있었지만, return
그렇다면 움직이지 않고 exit
라면 정상적인 처리 종료 플로우를 타지 않고서 나빴기 때문에, 원래 태스크의 정의 개소로부터 처리를 쫓아 보았다.seeds.rb
if !Rails.env.development?
p "Nothing to do."
exit
end
흐름
1. activerecord 내에 있는 railties/databases.rake
db:seed
태스크는 다음 위치에서 정의된다.htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / 5-1-s ta ぇ / 아 c ゔ ぇ 레코 rd / ぃ b / 아 씨 ゔ ぇ _ 레코 rd / 라이 l 치에 s / 다바바 세s. 쓰다
railties내의
tasks/engine.rake
에도 app:db:seed
하지만 정의되고 있습니다만, 이것은 별개일까...?2. ActiveRecord::Tasks::DatabaseTasks.load_seed
이
module DatabaseTasks
에 정의된 seed_loader.load_seed
를 call 하고 있지만, seed_loader
란 무엇인가.htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / 5-1-s ta ぇ / 아 c ゔ ぇ 레코 rd / ぃ b / 아 씨 ゔ ぇ _ 레코 rd / 타 sks / 달팽이 _ sks. rb#L268-L276
seed_loader
는 function으로 module에 정의되어 있습니다.인스턴스 변수인
@seed_loader
에 값을 cache하면서 Rails.application
를 반환합니다.htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / 5-1-s ta ぇ / 아 c ゔ ぇ 레코 rd / ぃ b / 아 씨 ゔ ぇ _ 레코 rd / 타 sks / 달팽이 _ sks. rb#L102-L104
요점은
seed_loader.load_seed
는 Rails.application.load_seed
를 가리킨다.3. Rails.engine.load_seed
Rails.application
는 Rails.engine
를 확장합니다. Rails.application.load_seed
의 실체는 Rails.engine
에 정의된 Rails.engine.load_seed
이다.htps : // 기주 b. 이 m/라이 ls/라이 ls/bぉb/5-1-s타 bㅇ/라이 l치에 s/ぃb/라이 ls/엔기네. rb#L543-L550
이 function 안에서, 가장 가까운
db/seeds.rb
의 path 를 해결해 Kernel.load
로 그 파일을 읽어들이고 있다.4. Kernel.load
첫 번째 인수
file
에 입력된 경로를 따라 파일을 로드하는 built-in function.htps : // / cs. 루 by ぁん g. 오 rg / 그럼 / ㅁ st / 어 d / r r l / m / 아 d. HTML
Kernel.load로 읽은 스크립트로 조기 return하는 방법?
결국 이건 잘 모르겠어...
로드하는 Ruby 스크립트에 블록을 준비하고 그 안에 처리를 정의해 갈 수밖에 없다...? (별로 잘 모르겠어요)
결론
결국 이에서하고 싶은 것은 실현되었습니다.
참고
Reference
이 문제에 관하여(`rake db : seed`의 처리 흐름을 쫓았다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takoba/items/c0907a4c0ec8b51eb2a4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)