如何在carrierwave中找到来自id和name的url

时间:2013-10-29 03:53:51

标签: ruby-on-rails ruby carrierwave

我有模型消息,并附上文件

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

我尝试了很多方法来检索附件文件网址,它适用于公共存储桶,因为我从存储桶名称,ID,名称附加文件中设置了网址。在私人公众的情况下,它需要访问密钥和签名,到期。 是否有任何carrierwave的方式来查找附件文件URL

2 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 如果您以这种方式使用select,则无法访问相关模型上的CarrierWave方法。 select通常只有很少的用例;你可能不应该使用它。

  2. render json会忽略关联,除非您将其告知include他们(或者您已经覆盖了模型的as_json,或者您正在使用自定义序列化程序等。 ..)。

  3. 奖金半问题是join并不是你想要的。避免N + 1个查询的惯用方法是includes

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

    include: :attach_file更好的方法是使用像active_model_serializers这样的工具让视图层处理你的json序列化,但这个答案已经足够长了。

答案 1 :(得分:0)

尝试:

message = Message.find params[:id]
file_url = message.attach_file.path.url