2013-10-15 63 views
2

如何在下面的代碼中動態地傳遞選項散列?動態回形針選項散列

class Resource < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 

    has_attached_file :attachment #, paperclip_options from attachable 

end 


class ItemTypeOne < ActiveRecord::Base 
    has_many :resources, :as => :attachable, :dependent => :destroy 

    def paperclip_options 
     ITEM_TYPE_ONE_OPTIONS 
    end 
end 

class ItemTypeTwo < ActiveRecord::Base 
    has_many :resources, :as => :attachable, :dependent => :destroy 

    def paperclip_options 
     ITEM_TYPE_TWO_OPTIONS 
    end 
end 

我有兩種不同的模型(在上面的代碼中稱爲ItemTypeOne和ItemTypeTwo)。這兩款機型擁有完全不同的回形針存儲選項(樣式,路徑等)

回答

0

我認爲這會是這樣的

class Resource < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 

    has_attached_file :attachment, attachment_options 

    def attachment_options 
     attachable.paperclip_options 
    end 
end 

我跑,並沒有測試此代碼。讓我知道它是否有幫助。

你可能需要編寫檢查對象詮釋他的多態性關係的類型一個類的方法,然後根據該類型選項傳遞

+0

感謝您的回覆。不幸的是:'method_missing':未定義的局部變量或方法'attachment_options'爲#(NameError) – user1889776

+0

,如果你在方法定義的名稱前面加上'self.',嗯...不,這需要對實例進行操作,但引用調用是基於類的方法。 –

0

我不知道你在做什麼有可能在後時刻。

問題是has_attached_file正在執行Resource的上下文中。而且班級在任何時候都不知道將來的實例會具有哪種類型。

爲此,該調用需要獲取並存儲lambda(或方法名稱),然後在給定實例的上下文中對其進行評估(或調用方法)並使用調用返回的選項。只有這樣你纔能有不同的選擇,具體取決於關係的具體類型。

據我所知,paperclip沒有這個功能。

+0

正確,但我無法首先調用attachment_options方法。如果我嘗試類似has_attached_file:attachment,lambda {| attachment | attachment.instance.attachment_options}(假設attachment_options現在返回一個散列)我這個錯誤:未定義的方法'each'for#(NoMethodError)。似乎我不能用lambda替換哈希值?我可以用lambda替換散列中的某些鍵(例如:style),但看起來像我不能替代整個散列本身。這是我現在的首要問題。 – user1889776