我有模型消息,并附上文件
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
答案 0 :(得分:1)
这里有两个问题:
如果您以这种方式使用select
,则无法访问相关模型上的CarrierWave方法。 select
通常只有很少的用例;你可能不应该使用它。
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序列化,但这个答案已经足够长了。
答案 1 :(得分:0)
尝试:
message = Message.find params[:id]
file_url = message.attach_file.path.url