1

私のモデルは次のとおりです。

class User < ActiveRecord::Base

  has_one :info, :class_name => "PostulantInfo"
  mount_uploader :curriculum_vitae, DocumentUploader

#...

class PostulantInfo < ActiveRecord::Base
  belongs_to :user
  has_many :relatives
  has_many :studies, :class_name => "HighSchoolStudy", :foreign_key => :postulant_info_id

  mount_uploader :marriage_certificate, DocumentUploader
  mount_uploader :photo1, FaceImageUploader
  mount_uploader :photo2, SideFaceImageUploader

#...

class Relative < ActiveRecord::Base

  mount_uploader :birth_certificate, DocumentUploader

#...

class HighSchoolStudy < ActiveRecord::Base

  mount_uploader :degree_certificate, DocumentUploader
#...

実際、私はデフォルトの store_dir を持っています:

def store_dir
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

したがって、これは次のようなディレクトリ構造を作成しています。

 - uploads
  - user
   - curriculum_vitae
    - {user.id}
     - {the_file}
  -postulant_info
   - marriage_certificate
    - {postulant_info.id}
     - {the_file}
   - photo1
    - {postulant_info.id}
     - {the_file}
   - photo2
    - {postulant_info.id}
     - {the_file}
   - and so on...

しかし、私は次のようなものが欲しい:

 - uploads
  - {user.uuid}
   - {all_the_files_for_this_user}

user.uuid問題は、たとえば のmarriage_certificateファイルを保存したいときにを与える方法がわからないことですPostulantInfoしばらくwikiを探していましたが、この問題に役立つものを見つけることができませんでした.
考えられる解決策は、ファイルを含む各モデルに uuid 属性を追加し、次に user.uuid をそれぞれにコピーしてデータベースに保存することですが、これはリソースの無駄です。
ややこしい解決策は、モデルなどの親モデルにアクセスして、次のPostulantInfoようなことを行うことです。

def store_dir
  "uploads/#{model.user.uuid}"
end

しかし、これは次のことを意味します。

  • 子孫レベルごとにアップローダーを作成する
  • およびに追加belongs_to :PostulantInfoします。これらのモデルが親について知っている理由がない場合 (明らかに uuid を知っていることを除いて)RelativeHighSchoolStudy
  • ファイルへのリンクをレンダリングするたびに、Rails は uuid を知るために db クエリを作成します。これは、Devise のおかげで既に持っているものです。current_user.uuid

これを達成するための最良の方法は何ですか?前もって感謝します

4

0 に答える 0