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。在私有公共的情况下,它需要访问密钥和签名,过期。有没有carrierwave的方法来查找附件的url

4

2 回答 2

1

你在这里有两个问题:

  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

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

于 2013-10-29T13:43:31.777 回答
0

尝试:

message = Message.find params[:id]
file_url = message.attach_file.path.url
于 2013-10-29T04:15:56.430 回答