Разбор массива нескольких объектов в Jbuilder

Как извлечь значения, присутствующие в массиве нескольких объектов, используя jbuilder.?

У меня есть массив из нескольких объектов.

@array1= [ ]
#pushed different types of objects into this array.
if xyz
@array1 << object_type1 # having fields id,f_name
else 
@array1 << object_type2 # having fields id,l_name

Сейчас в jbuilder хочу

json.array! @array1 do |myarray|
 json.id myarray.id
 json.name myarray.f_name || myarray.l_name # how to check object type here 
end

когда я пытаюсь это дает мне ошибку как

undefined method `l_name' for #<Object_type1:0xb496eda8>

Как проверить или сказать jbuilder, какой тип объекта он должен использовать для поля имени.?

2 ответа

Решение

Если оба ваших ObjectTypes являются моделями ActiveRecord, вы можете сделать что-то более чистое, например:

json.array! @array1 do |myarray|
  json.name myarray.has_attribute? "f_name" ? myarray.f_name : myarray.l_name
  json.id myarray.id
end

Это проверяет, если myarray имеет атрибут f_name и если он использует это, в противном случае мы знаем, что это другой ObjectType поэтому мы используем l_name, Если вы раньше не видели однострочный оператор if / else, подобный этому, я использую следующий синтаксис:

<condition> ? <if_true> : <if_false>

Таким образом, вы можете делать такие вещи, как:

@post.nil? ? return "No post here" : return "Found a post"

Или вы можете добавить метод к каждому из ваших ObjectTypes в их моделях, как:

def name
  l_name # or f_name, depending on which ObjectType it is
end

Тогда вы могли бы сделать:

json.array! @array1 do |myarray|
  json.name myarray.name
  json.id myarray.id
end

Я не знаю, правильный ли это путь или нет, но я попытался и получил то, что хотел

 json.array! @array1 do |myaarray|
     if myarray.class == ObjectType
       json.name myarray.f_name
       json.id myarray.id
      else
       json.name myarray.l_name
       json.id myarray.id
      end  
   end
Другие вопросы по тегам