如何返回通过Rails模型方法定义的属性数组,以及数据库表中的属性?

时间:2010-11-09 23:42:19

标签: ruby-on-rails arrays attributes instance

我有一个名为Person的Rails模型,它具有first_name和last_name的数据库表列。我还定义了一个full_name方法来返回实例的组合first_name和last_name。

有没有办法返回一个包含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的哈希数组。

先谢谢!

3 个答案:

答案 0 :(得分:1)

first_namelast_name是在inspect方法中打印的数据库属性。 如果您想访问用户对象上的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,则打印数据库属性。

如果您需要全名,则需要在返回的User对象上调用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格式,请执行以下操作

u.to_json(:methods => [:full_name])

有关详细信息,请参阅to_json documentation

编辑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])

答案 1 :(得分:0)

在敲打我的脑袋后,看起来像获取所有数据库属性的数组以及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"} 

答案 2 :(得分:0)

您可以通过以下方式为一行中的单个人执行此操作:

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

关于你对Person.all和返回哈希的渴望,你为什么要这样做?默认情况下,它返回一个Person实例数组,我不建议覆盖默认的rails方法,以返回与通常预期不同的类型。如果你想要这种行为,我会在Person上添加一个类方法,比如Person.all_hashes,它为每个结果返回一个哈希数组。