2013-04-15 135 views
0

希望您一切順利!可以使用多個表格和列名稱的Rails方法

我有我在想,如果某種靈魂可以與幫助普通的查詢?這真的是一分鐘好奇心的問題,但我覺得它可能是未來相當有用的信息片段。

是否可以寫一個可以傳遞一個表的名稱和屬性(列)的名稱的方法以及對這些進行操作?我想這種方法的主要用途是在對錶格進行重複操作時保持代碼乾燥。

爲例(雖然完全是一個玩具的例子)假設我有一個方法:

def switch(table_name, column_name) 
    #do some operation on table_name.column_name 
end 

我已經找到了如何做這樣的訪問表:

def model_for_table(table_name) 
    table_name.to_s.classify.constantize 
end 

這將採取underscored_lowercase_string並返回表名稱,以便像model_for_table("registered_user").find(1)雖然這是不必要的情況下,其中表名可以被硬編碼

但它不像上面例子中使用的model_for_table("registered_user").column_name。有沒有類似於上面提供的model_for_table方法來將字符串轉換爲屬性名稱?

有誰知道我怎麼能實現呢?它甚至有可能嗎?

在此先感謝

+0

知道你想要做什麼會是有用的。 Rails是面向對象的,所以一般來說你不需要擔心你的表 - 只需要使用對象。如果你知道所有這些,並且真的需要直接操縱你的桌子,那就繼續吧! – Matt

+0

前些日子,我在爲一些HABTM協會編寫了一些房子的同時,想到我可能需要在應用程序的某個時候再次做這件事。 – DazBaldwin

回答

1

的問題是,你需要你要訪問的列上工作模型的實例。如果你有一個RegisteredUser模型,請嘗試(在Rails控制檯中)RegisteredUser.id(或任何屬性名稱)。它不會工作。但是,如果你做了RegisteredUser.first.id(假設你有一個保存),它將工作。

所以這取決於你想要完成的任務。如果你的switch方法是爲了對你的模型實例做些什麼,那麼這個方法仍然可以工作。

def switch(table_name, column_name) 
    model = model_for_table(table_name) 
    model.all.each do |model_instance| 
    puts "model_instance #{column_name} is #{model_instance.send(column_name)}" 
    end 
end 

注:send方法接受一個符號或字符串,並執行與實例,它被稱爲該名稱的方法。這是一個普通的Ruby事情,而不是Rails的事情。

記住,你的model_for_table方法返回回類,而不是一個實例。

+0

這就是兔子!非常感謝,正如我在上面的評論中所說的那樣,這個想法在編寫一些HABTM關聯的房子時給了我,因爲它們會有一些表格,所以將代碼封裝在一個方法中會更好在整個應用程序中重複非常類似的代碼。非常感謝你的時間 – DazBaldwin

+0

不用擔心!我喜歡DRY代碼,但是如果它使用過多的元代碼會讓人感到困惑,那麼請謹慎起見 – MrDanA

+0

我會牢記這一點,但爲此目的,它實際上只是遍歷表格以找到任何不符合的HABTM沒有關聯,只是發生了幾個我想查找關聯關係的表,每個表都有不同的表名和關聯名。就像我說的那樣,我現在有一些用途,我知道如何使用它 – DazBaldwin

相關問題