2016-11-11 109 views
-1

我有N個表和N個函數。所有函數具有相同的代碼只更改表名稱。我可以使所有這些功能都使用通用功能嗎?將表名作爲參數傳遞給ruby方法

像這樣的事情

def funcN 
    common_func(tableN) 
end 

private 

def common_func(tablename) 
    "Some Code" 
end 

我知道可能有多種方式.. 什麼是可能的方式來做到這一點?

回答

1

你非常接近。只是通過一個表名作爲參數傳遞給funcN

def funcN(tableN) 
    common_func(tableN) 
end 

private 

def common_func(tablename) 
    "Some Code" 
end 

什麼都是可能的方式來做到這一點?

理論上有無數的方法可以解決某個問題,所以你永遠不會得到這個問題的答案。

P.S.你的命名不符合慣例。這是怎麼會看,如果它做的事:

def func_n(table_name) 
    common_func(table_name) 
end 

private 

def common_func(table_name) 
    # code omitted 
end 
2

如果型號名稱是funcN靜態然後只是將它作爲string例如考慮post然後funcN("Post")或從軌道記錄funcN(@record.class.to_s)

在私有方法搭上弦PARAM和你tablename,您可以通過myModel = tablename.constantize

其轉換成模型,然後就可以繼續與你對模型的代碼行myModel

+0

什麼意思是靜態模型名稱?我得到了一次錯誤,但我現在沒有得到它。你能解釋一下,以便我能理解當時我做錯了什麼嗎? – vidal

+0

我的意思是如果你意識到你想要傳遞的模型名稱是靜態的,那麼從活動記錄中獲取它並傳遞將是動態的。 例如,如果模型名稱發佈是肯定的,那麼你可以像funcName(「Post」)那樣靜態地傳遞它。 –

0

如果通常在Ruby中稱爲方法的函數位於模型中,則它可以引用table_name。您可以使用模塊共享通用代碼,並將其包含在每個需要它的模型中,例如:

class Person < AR::Base 
    include CommonCode 
end 

class Fruit < AR::Base 
    include CommonCode 
end 

module CommonCode 
    def do_something 
    self.table_name 
    end 
end 

Person.new.do_something # => 'people' 
Fruit.new.do_something # => 'fruits' 
相關問題