2

モデル メッセージがあり、ファイルを添付します

class Message
    has_one :attach_file
end

class AttachFile
    mount_uploader :path, FileUploader
end

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

添付ファイル付きのコントローラ リスト メッセージがあります。

class Controller
     def index
         message = Message.join(:attach_file).select('messages.*, attach_files.*')
         render :json => message
     end
end

添付ファイルの URL を取得するために多くの方法を試しましたが、バケット名、ID、添付ファイルの名前から URL を設定したため、パブリック バケットで動作します。プライベート パブリックの場合は、アクセス キーと署名が必要で、有効期限が切れます。添付ファイルの URL を見つけるための Carrierwave の方法はありますか

4

2 に答える 2

1

ここには 2 つの問題があります。

  1. この方法で使用selectしている場合、関連付けられたモデルで CarrierWave のメソッドにアクセスできません。select一般に、ユースケースはほとんどありません。おそらく使用しないでください。

  2. render jsonあなたが彼らにそれを伝えない限り、関連付けを無視しincludeます(または、モデルの をすでにオーバーライドしているas_json、またはカスタムシリアライザーを使用しているなど...)。

おまけの準問題は、それjoinが本当にあなたがここで望んでいるものではないということです. N + 1 クエリを回避する慣用的な方法はincludes.

def index
  messages = Message.includes(:attach_file)
  render json: messages, include: :attach_file 
end

active_model_serializersinclude: :attach_fileのようなツールを使用して、ビュー レイヤーに json シリアル化を処理させるよりもさらに優れていますが、この回答はそのままで十分に長くなります。

于 2013-10-29T13:43:31.777 に答える