在Jbuilder中解析多个对象的数组

时间:2014-08-20 11:23:57

标签: ruby-on-rails json ruby-on-rails-4 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 个答案:

答案 0 :(得分:1)

我不知道这是否是正确的方式,但我尝试并得到了我想要的东西

 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

答案 1 :(得分:1)

如果你的两个ObjectType都是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"

或者您可以在模型中为每个ObjectType添加一个方法,如:

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