2016-01-13 3 views
-2

Дан массив так:Динамический метод призывает Rails ассоциации

%w{ field_one, field_two, some_association.field_one } 

Мне нужно перебрать это и динамически вызывать эти методы данного объекта, точно так, как описано здесь: Ruby send method with rails associations

До сих пор у меня есть это, который не может корректно получать значения:

field.include?('.') ? field.split('.').inject(some_object, :send) : some_object.send(field) 

Кроме того, хотя, мне нужно позвонить: human_attribute_name на нужный класс для создания этикеток. Что такое чистый способ достичь этого?

+1

Так что у вас есть работает вы можете уточнить, что вы подразумеваете под «Кроме того, хотя, мне нужно позвонить : human_attribute_name в правильном классе для создания меток ". Я не знаю, что такое «правильный» класс или что вы подразумеваете под «ярлыками», пожалуйста, объясните проблему, с которой вы столкнулись, а не проблему, которую вы уже решили. – engineersmnky

ответ

0

Непонятно, что вы пытаетесь выполнить, но если бы я должен был догадаться, я бы сказал, что вы пытаетесь создать какую-то систему CMS или отчетности, в которой определение того, какие данные для отображения могут быть изменены через пользовательский интерфейс. Есть драгоценности для такого рода вещей, но видя, как вы на этом треке ...

От: human_attribute_name Предполагаю, вы имеете в виду дружественное имя, которое будет отображаться на странице в качестве метки. Прежде всего, было бы более целесообразно использовать строку, а не символ, поскольку тогда вы можете использовать пробелы и больше символов. Предполагая, что вы никогда не намереваетесь дублировать имена ярлыков на той же веб-странице, вы можете попробовать использовать хеш вместо массива.

fields = { 
      "Field One" => "field_one" , 
      "Field Two" => "field_two" , 
      "Field One Of Some Association" => "some_association.field_one" 
     } 

, а затем введите данные так же, как показано в ответе, на который вы ссылались.

data = {} 

fields.each_pair do | friendly_name, attribute | 
    data[friendly_name] = if attribute.include?('.') 
    attribute.split('.').inject(some_object, :send) 
    else 
    some_object.send(attribute) 
    end 
end 

Это должно оставить вас с хэша вы можете петлю над на ваш взгляд, как этот

{ 
    "Field One" => "Mr" , 
    "Field Two" => "Data", 
    "Field One Of Some Association" => "A Friend Of Mr Data" 
} 
Смежные вопросы