carrierwave사용시, 새로운 version을 추가하거나 기존의 version중 process를 변경해야 하는 경우가 종종 발생합니다.
이때 새로 만든 혹은 변경된 version의 이미지를 생성을 해야 하는데, 방법은 크게 2가지 입니다.
- 이미지을 재업로드해서, 이미지를 만드는 방법
- 해당 이미지만 만드는 방법
1. 이미지 재업로드 하는 방법
은 웹페이지에서 일일이 하나씩 해주는 훌륭한 방법이 있습니다.
하지만 좀 더 아름다운 방법은 rails console에서 코드 한줄로 해결하는 방법이죠.
User.all.each { |u| u.update_attributes(profile: "#{Rails.root}/public/#{u.profile_url}") if u.profile.present? }
version 변경이 자주 일어나는게 아니라면, 위 코드 한줄로 해결하는것도 나쁘지 않은 방법입니다.
다만.이렇게 하게되면 model에 걸려있는 filter들도 함께 동작을 하게 됨으로 불필요한 리소스를 낭비하게 됩니다.
그래서
2. 해당 이미지만 만드는 방법
으로 가는것이 좀 더 나은 방법입니다.
여기서 miniMagick을 이용하는 모듈로 만들수 도 있는데, 상황에 따라서 RMagick을 쓸 수 도 있는것이라 Carrierwave에 모듈을 추가하는 방법이 안정적입니다.
사실 Carrierwave에 recreate_versions! 이란 메소드가 있습니다.
recreate_versions!은 모든 version을 다 만드는건데, (하단 ps.2참고)
특정 version 하나만 만드는 함수는 없습니다.
그래서 특정 version 하나만 만드는 함수를 만들어야 하는데.. 다행스럽게도 누군가가 코드를 짜놓았더군요.
감사하는 마음을 가지고 그대로 써먹습니다.
아래 코드를 아무대나 넣어줍니다.
저의 경우 config/initializers에 넣었습니다.
그리고 난 후
console창으로 가셔서 uploader.recreate_version!([VERSION]) 해주시면 됩니다.
예)
User.all.each { |user| user.profile.recreate_version!([VERSION]) }
근데, version 수정이 비일비재하게 일어난다면..
그때마다 console들어가서 일일이 타이핑해주기가 여간 귀찮은게 아닙니다.
그래서 간결하게 밖에서 과업을 수행할 수 있도록 task로 만들어봤습니다.
방법은 간단합니다.
위 코드를 lib/안에 적당한 파일명으로 넣습니다.
사용법은
- User라는 모델에
- profile이라는 uploader가 있고
- normal 이라는 version을 추가했다면
rake generate_photo_version[user,profile,normal,false]
다른예로..
version :normal의 process를 변경하여.. 이미지를 새로 만들어야 할때
rake generate_photo_version[user,profile,normal,true]
하시면 됩니다.
PS
- 속도차이는 원본의 용량과 관계가 있을뿐,
이미지 한개를 만들든 10개를 만들든.. 속도 차이는 미비합니다. - 만약 모든 version을 다 다시 만들고 싶은 경우
recreate_versions!를 사용하시면 됩니다. (https://github.com/jnicklas/carrierwave/blob/master/lib/carrierwave/uploader/versions.rb)
사용예) User.first.profile.recreate_versions! - http://menonrails.com/articles/33 에 투고되었습니다.
참고링크