2012-05-16 40 views
1

我想知道是否可以引用對象的屬性。通過引用更新屬性

的目標用戶具有屬性first_name,因此通常如果我們要更新的第一個名字屬性,我們可以這樣做:

user0 = User.new() 
user0.update_attribute(:first_name, "joe") 

現在我的問題是,我可以更新通過像這樣的另一個變量/符號:first_name屬性:

user0.update_attribute(:fname_ref, "jack") 
user0.first_name #=> has the value jack 

我一直在尋找類似於Perl的變量引用,但在Ruby中沒有提到任何東西。

----------編輯

我在做軌道上教程林達紅寶石的中間,並在創建模塊表中的調整項目的位置中間。 不幸的是,當我第一次開始我叫我的表中的列不同 pages.page_position, subjects.subject_position, sections.section_position

現在模塊PositionMover是翻過三種模式中使用,所以現在 我有一個問題,因爲屬性名稱是每個模型

不同所以我認爲不用擔心,我會只是創建一個指針/ REFFERENCE每個模型

:position = :pages_position , :position = :subjects_position , :position = :section_position

因此問題,如果它甚至有可能做到這一點。

如果它不可能,任何建議我該怎麼做,所以模塊可以使用 橫跨三種不同的模型,具有不同的屬性名稱。

對不起,我是一個新手。

+0

什麼是你的使用情況呢?瞭解它可以幫助我們找到解決問題的辦法。 –

回答

2

符號不像變量,它們實際上是一個對象類型,如String或Fixnum,因此可以有一個符號類型的變量。

我認爲這是你在找什麼:

attribute = :first_name 
user0.update_attribute(attribute, "jack") 
user0.first_name #=> has the value jack 

更新:如果你有一個字符串,需要轉換爲符號,(我不知道,如果你需要這個update_attribute

foo = "string" 
foo.to_sym #=> :string 
+0

這就是我最後使用.to_sym方法所做的。但現在將嘗試使用'屬性=:first_name' – timex88

0

您還可以使用senddocs和使用符號或字符串來引用屬性的方法。 send可以非常有用,因爲它使您可以選擇您將在運行時調用的方法。

user.first_name = "Jack" # set first_name to Jack 
         # Note: method "first_name=" (a settor) is being used  

attribute = "first_name" 
user.send attribute + "=", "Jack" # set first_name to Jack 
            # The string "first_name=" is coerced into 
            # a symbol 

attribute = :first_name 
val = user.send attribute # => returns "Jack" 
0

看到githubActiveRecord::Persistence模塊中的update_attribute定義:

def update_attribute(name, value) 
    name = name.to_s 
    verify_readonly_attribute(name) 
    send("#{name}=", value) 
    save(:validate => false) 
end 

這使我相信,你可以添加以下到您的模型來實現這一行爲:

alias_method :fname_ref= :first_name= 

我是我有興趣知道爲什麼你要這樣做@Andrew Marshall問道。

1

使用alias_attribute。定義爲像每個型號:

頁模式

alias_attribute:位置,:pages_position

主題模式

alias_attribute:位置,:subjects_position

科型號

alias_attribute:position,:section_position

並在每個模型中使用(Model.position = values)。希望它解決你的問題。

+0

這是我剛試過另一種方法,快速的問題,我測試了使用:位置:subject_position,他們都工作,則這正常嗎? – timex88

+0

是因爲你所創建的別名,所以你也可以通過其他的名字來稱呼它。 – Vik

+0

它對你有幫助嗎? – Vik