Разбор массива нескольких объектов в 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