2012-03-08 3 views
0

Я пишу функцию рельсов, которая может добавить объект «Город» или «Автомобиль» или «Строительство».Метод или свойство ссылки со строковым вводом

Первая часть функции - создать объект Car или Building с заданным именем, а затем добавить его в список автомобилей или зданий города.

def addObject(obj_type,obj_name,city_id) 
    new_obj = obj_type.constantize.create(:name => obj_name) 
    city = City.find(city_id) 

    city.obj_type.underscore.pluralize << new_obj 
end 

С Inflector, программа может использовать constantize для ссылки на нужный класс модели.

(благодаря Referencing Model with String input)

Eg:

new_obj = obj_type.constantize.create(:name => obj_name) 

Однако при попытке получить доступ к спискам внутри City объекта,

obj_type.underscore.pluralize 

может превратить "Автомобиль" в «автомобили "

Однако он будет работать только как голая строка, так как е наблюдение не будет работать:

city.obj_type.underscore.pluralize #city.cars desired 

потребуется какое-то метапрограммирования функции, такие как eval()?

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

+1

Вы видели 'инфлектор # tableize'? – Eric

+0

Кажется, что делать то же самое, что и «Inflector # underscore» и 'Inflector # pluralize' вместе. Спасибо, что указали на это! – rickypai

ответ

2

Вы можете сделать:

city.send(obj_type.underscore.pluralize) << new_obj 

В этом случае вы создаете метод, который вы хотите звонить в вашем городе Objet и использовать его посыла

+0

спасибо. это работает отлично! – rickypai

Смежные вопросы