【问题标题】:How do I return an array of attributes defined via a Rails model method, as well as the attributes in the database table?如何返回通过 Rails 模型方法定义的属性数组以及数据库表中的属性?
【发布时间】:2010-11-09 23:42:19
【问题描述】:

我有一个名为 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 来返回一个哈希数组,其中还包括全名。

提前致谢!

【问题讨论】:

    标签: ruby-on-rails arrays attributes instance


    【解决方案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,则打印数据库属性。

    如果需要全名,需要在返回的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_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])
    

    【讨论】:

    • 谢谢,但是有没有办法在一个哈希中返回所有三个:first_name、last_name 和 full_name?当我尝试您的代码时,您的两个示例都没有这样做。
    • 一个哈希是什么意思?扩展您的问题以包含预期结果。
    • 请看问题中的第三个例子:#&lt;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"&gt;...返回first_name、last_name和full_name。
    • 换句话说,如果我调用 Person.last... 我希望它返回包含 full_name 以及 first_name 和 last_name 的内容。谢谢!
    • 抱歉,不清楚。将尝试获得... 现在,如果调用 I User.last,我会收到一个用户对象,其中包含数组中的 first_name 和 last_name 但不包含 full_name。要获得 full_name,我需要单独调用 User.last.full_name。我想要一个包含所有三个名称、名字、姓氏和全名的数组。我想我可能需要在 User 对象上调用 map 方法来将 full_name 属性添加到数组中。
    【解决方案2】:

    敲了我的脑袋之后,它看起来像是一种获取所有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"} 
    

    【讨论】:

      【解决方案3】:

      您可以在一行中为单个 Person 执行此操作:

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

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

      【讨论】:

      • 非常有帮助,我不得不承认我认为 Person 实例本身就是数组......所以,我不明白为什么我不能在 Person 实例中插入另一个值。抱歉,对 Ruby on Rails 很陌生!
      • @GeekActive,既然您发现答案有帮助并接受了它,您可能也应该投票赞成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多