2010-11-09 56 views
1

我有一個名爲Person的Rails模型,它具有first_name和last_name的數據庫表列。我還定義了一個full_name方法來返回實例的組合first_name和last_name。如何返回通過Rails模型方法定義的屬性數組以及數據庫表中的屬性?

有沒有辦法返回一個數組,哈希,或具有first_name,last_name,以及full_name的對象?

這裏是我的代碼:

#person.rb 
class Person < ActiveRecord::Base 
    validates_presence_of :first_name, :last_name 

    def full_name 
     self.first_name + " " + self.last_name 
    end 
end 

下面是我在Rails的控制檯已經試過:

ruby-1.8.7-p302 > person = Person.new({:first_name=>"Bruce", :last_name=>"Wayne"}) 
=> #<Person id: nil, first_name: "Bruce", :last_name: "Wayne", created_at: nil, updated_at: nil> 

ruby-1.8.7-p302 > person.save! 
=> true 

ruby-1.8.7-p302 > Person.last 
=> #<Person id: 1, first_name: "Bruce", :last_name: "Wayne", created_at: "2010-11-09 22:53:14", updated_at: "2010-11-09 22:53:14"> 

是否有可能得到的東西回來像這個:

ruby-1.8.7-p302 > Person.last 
=> #<Person id: 1, first_name: "Bruce", :last_name: "Wayne", :full_name: "Bruce Wayne", created_at: "2010-11-09 22:53:14", updated_at: "2010-11-09 22:53:14"> 

或者它只能從數據庫中返回值嗎?

最後,我希望能夠呼叫Person.all返回一個哈希數組,其中也包括full_name。

感謝先進!

回答

1

first_namelast_name是以檢查方法打印的DB屬性。 如果您想訪問用戶對象上的full_name調用full_name

User.last.full_name 

所以,如果你想用戶的哈希值與full_name的關鍵:

@users = {} 
User.all.each{|u| @users[u.full_name] = u} 

編輯1

User.last調用返回的User對象。在控制檯中打印的內容取決於如何實現對象的檢查方法。在ActiveRecord的情況下,打印數據庫屬性。

如果您需要全名,則需要在返回的用戶對象上調用full_name方法。

我還不清楚你在做什麼。

編輯2

u = User.last 
[u.full_name, u.age, u.phone] # array 
{:full_name => u.full_name, :age => u.age, :phone => u.phone } #hash 

編輯3

如果你想獲得一個JSON格式了一個對象的請執行下列操作

​​

參考to_jsondocumentation更多細節。

編輯4

的to_json方法includeexclude選項供您選擇您需要的屬性。 to_json方法可以完全控制數據選擇。有關更多詳細信息,請參閱上面的文檔鏈接。

u.to_json(:methods => [:full_name], :include => [:first_name, :last_name]) 

如果您需要包括附加屬性,他們在上面的例子添加到:include陣列。

編輯5

要與respond_with一起使用請執行下列操作:

respond_with(@users, :methods => [:full_name], 
        :include => [:first_name, :last_name]) 
+0

謝謝,但有沒有辦法在一個散列內返回所有三個:first_name,last_name和full_name?當我嘗試你的代碼時,你的兩個例子都沒有。 – Chanpory 2010-11-10 00:02:58

+0

你是什麼意思的一個散列?擴展您的問題以包含預期結果。 – 2010-11-10 00:06:25

+0

請查看問題中的第三個例子:'#'...返回first_name,last_name和full_name。 – Chanpory 2010-11-10 00:07:53

0

敲我的頭後,它看起來像一個方式來獲得所有DB的數組屬性加FULL_NAME屬性是要做到:

person = Person.last.attributes 
person["full_name"] = Person.last.full_name 

在控制檯,這將返回類似:

=> {"first_name" => "Bruce", "created_at" => Tue Nov 09 22:53:14 UTC 2010, "updated_at" => Tue Nov 09 22:53:14 UTC 2010", "id" => 58, "last_name" => "Wayne", "full_name" => "Bruce Wayne"} 
0

你可以爲一個人與一個行做到這一點:

Person.first.instance_eval { attributes.merge("full_name" => full_name)} 

關於你的願望,Person.all並返回哈希,你爲什麼要這樣的行爲?默認情況下,它返回一個Person實例數組,我不推薦覆蓋默認的Rails方法來返回一個不同於通常預期的類型。如果你想要這種行爲,我會在Person上添加一個類方法,像Person.all_hashes,它爲每個結果返回一個散列數組。

+0

非常有幫助,我不得不承認我認爲Person實例本身就是數組......所以,我無法理解爲什麼我不能在Person實例中插入另一個值。對不起,Ruby on Rails很新! – Chanpory 2010-11-10 02:11:16

+0

@GeekActive,既然你發現答案有幫助並且接受了它,你應該也可以投票贊成。 – Zabba 2010-11-10 07:06:15

+0

我沒有足夠的聲望點來支持它:-( – Chanpory 2010-11-10 07:18:40

相關問題