2008-10-01 3 views
0

Этот вопрос составлен на основе another question of mine (с благодарностью ответил).Данные объекта на объект

Так что, если в модели у меня есть это:

def self.find_extended 
    person = Person.find(:first) 
    complete_name = person.firstname + ', ' + person.lastname 
    return person 
end 

Как я могу вводить полное имя объекта людей так в моем контроллере/зрении я могу получить доступ к этому person.complete_name?

Спасибо за ваше время,
Силвиу

ответ

6

Я думаю, что лучший способ сделать это создание атрибута complete_name в вашем классе Person:

def complete_name 
    firstname + ', ' + lastname 
end 
1

Вы можете определить:

attr_accessor :complete_name 

в модели человека, а затем просто сделать person.complete_name= person.firstname + ', ' + person.lastname

+0

Ваш ответ был так же хорош для меня, но я обнаружил, что решение IDBD было более элегантным – 2008-10-01 17:25:08

1

Кроме того, еще одна заметка. В Ruby вам не нужен этот оператор return. Будет возвращено последнее утверждение в вашем методе.

2

Если вы собираетесь перебирать много записей, то использование интерполированной строки будет более экономичным.

def complete_name 
    "#{firstname}, #{lastname}" 
end 

Использование String#+ для конкатенации строк создает объекты String, на каждом шаге. Другими словами, если firstname является 'John'lastname и является 'Doe', то каждая из этих строк будет существовать в памяти и должны быть сборщиком мусора в какой-то момент: 'John', 'Doe', 'John, ', и, наконец, 'John, Doe'. Не говоря уже о том, что вместо однострочной интерполяции есть три метода, которые более эффективно реализованы в C.

Если вы используете нотацию #{}, то вы избегаете создания строки 'John, '. Не имеет значения при работе с одной или двумя записями, но в больших наборах данных, используемых во всех видах методов, он может быстро складываться.