我有一个名为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的哈希数组。
先谢谢!
答案 0 :(得分:1)
first_name
和last_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方法有include
和exclude
选项供您选择所需的属性。 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,它为每个结果返回一个哈希数组。