2013-10-29 53 views
2

我有模式消息,並附加文件如何找到標識和名稱的網址在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 

我嘗試了很多方法來檢索附加文件的URL,它適用於公共桶,因爲我從水桶姓名,ID,名稱設置URL附加文件。在私人公開的情況下,它需要訪問密鑰和簽名,到期。 有任何carrierwave的方式找到附加文件的URL

+0

你能弄清楚這一點嗎?如何使用carrierwave使用原始SQL SELECT? – mrudult

回答

1

您這裏有兩個問題:如果你以這種方式使用select

  1. 你沒有訪問到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序列化,但這個答案的已經足夠長,因爲它是。

+0

我實際上使用active_model_serializers。上面的例子只是簡單的例子。但是你知道,當你有複雜的查詢時,我們需要加入許多表。在這種情況下,我們需要從id,name等原始信息中獲得url ...可能嗎? – MQuy

+0

如果你想使用CarrierWave的'url'方法,你需要一個叫做'mount_uploader'的模型的實例。在你的情況下,它意味着不使用'select'將所有數據合併到一個表中。否則,你必須自己計算它。 – Taavo

0

嘗試:

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

我知道那種方式,但我做不到。上面的例子只是演示案例。因爲,如果你列出所有帶附件的郵件,那麼我們不能這樣做 – MQuy

+0

對不起,但我不明白爲什麼它不起作用。當您使用上述代碼時,您能否更新出現問題的問題? – jcm

+0

這不是錯的,你可以這樣做,但是當你必須列出帶有附件文件的所有消息時,它會遇到問題。我假設你必須在主類上使用Message來查詢sql,因爲你有時需要和User一起加入。 – MQuy

相關問題