2014-02-19 89 views
0

我想創建一個可供不同模型包含的常見映射功能的關注。這個模塊將有一個返回計算值的方法,除非包含的模型已經設置了相同名稱的屬性。從包含的模型屬性中獲取相同名稱的模塊方法

例如:

module Mappable 
    extend ActiveSupport::Concern 

    included do 
    has_one :map, as: :mappable, dependent: :destroy 
    end 

    def centroid 
    Point('123.45 321.21') #whatever 
    end 

    def longitude 
    super || centroid.x 
    end 

    def latitude 
    super || centroid.y 
    end 
end 

所以在方法「超級」將是模型的「東經」或「緯度」屬性。如果沒有設置,從質心得到它。

UPDATE:

我的代碼實際工作的寫入。我沒有正確測試這個問題。

+1

你已經有了什麼模塊問題? – usha

+0

NoMethodError:super:沒有超類方法'latitude'for#

+0

包含模塊後,您無法調用重寫的方法。如果您需要覆蓋特定方法的模塊行爲,請在包含該模塊後重新定義類中的方法。 –

回答

0

您可以使用由紅寶石提供的defined?方法

def longitude 
    if defined?(super) 
    super || centroid.x 
    else 
    centroid.x 
    end 
end 

def latitude 
    if defined?(super) 
    super || centroid.y 
    else 
    centroid.y 
    end 
end 
0

您可以覆蓋的方法,依靠的ActiveRecord模型attributes哈希(其中值存儲):

module Mappable 
    extend ActiveSupport::Concern 

    def longitude 
    attributes[:longitude] || centroid.x 
    end 

    # etc... 
end 

我自己並沒有使用這種技術,所以可能有一些我沒有想到的問題。寫一些測試並試一試。

相關問題