Как мне вернуть массив атрибутов, определенных с помощью метода модели Rails, а также атрибуты в таблице базы данных? - PullRequest
1 голос
/ 10 ноября 2010

У меня есть модель Rails под названием Person, в которой есть столбцы таблицы базы данных для first_name и last_name.Я также определил метод full_name, чтобы вернуть объединенные first_name и last_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, чтобы вернуть массив хэшей, который также включает полное_имя.

Спасибо заранее!

Ответы [ 3 ]

1 голос
/ 10 ноября 2010

first_name и last_name - это атрибуты БД, которые печатаются в методе проверки. Если вы хотите получить доступ к 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 для возвращенного объекта User.

Мне все еще не ясно, что вы пытаетесь сделать.

Редактировать 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 .

Редактировать 4

Метод to_json имеет опции include и exclude для выбора необходимых атрибутов. Метод to_json дает вам полный контроль над выбором данных. Для получения более подробной информации см. Ссылку на документацию выше.

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

Если вам нужно включить дополнительные атрибуты, добавьте их в массив :include в приведенном выше примере.

Редактировать 5

Чтобы использовать это вместе с response_with, сделайте следующее:

respond_with(@users, :methods => [:full_name], 
                     :include => [:first_name, :last_name])
0 голосов
/ 10 ноября 2010

Вы можете сделать это для одного человека в одной строке с помощью:

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

Что касается вашего желания Person.all и возврата хэшей, зачем вам это поведение? По умолчанию он возвращает массив экземпляров Person, и я бы не рекомендовал переопределять метод rails по умолчанию, чтобы он возвращал тип, отличный от ожидаемого. Если вам нужно такое поведение, я бы добавил метод класса Person, что-то вроде Person.all_hashes, который возвращает массив хэшей для каждого результата.

0 голосов
/ 10 ноября 2010

После того, как я ударился головой, это похоже на способ получить массив всех атрибутов БД, плюс атрибут 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"} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...