在rails中使用jbuilder来构造具有不同类的对象数组

时间:2016-03-29 23:47:10

标签: ruby-on-rails ruby-on-rails-3 jbuilder

我的rails应用程序中的模型(FirstModel)与另一个模型(Item)具有has_many关系。

sumIdx(2).next(first).next(second).next(third).value // 15

项目本身属于:item_thing通过多态关联。 FirstModel上的方法返回" items"的数组,而不是连接模型对象(属于Item类),而是每个Item对象的item_thing,因此它是不同类的对象数组(在rails控制台中检查,该方法返回数组就好了)

class FirstModel < ActiveRecord::Base

  has_many :items, :dependent => :destroy

  def item_array
    a = []
    self.items.each do |item|
      a.push(item.item_thing)
    end
    a
  end
end

在我的show.json.jbuilder中,对于FirstModel,我想采取那些&#34;项目&#34;并根据项目所属的类使用不同的模板。以下文件路径为&#34; views / api / items / show.jbuilder&#34;

class Item < ActiveRecord::Base
  belongs_to :item_thing,  :polymorphic => true


end

汽车和图书模板路径是&#34; views / api / cars / show.json.jbuilder&#34;和&#34; views / api / books / show.json.jbuilder。

当我从上面的模板中获取json时,FirstModel对象的名称是可见的,items数组是空的,而我正在尝试获取每个项目的哈希数组,通过其各自的模板呈现。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我认为如果将类字符串更改为实际的类名,您的代码将会起作用。

即。 User而非"User"

或者您可以保留字符串并使用.class.to_s,这将为用户记录返回"User"

如果您对元编程感兴趣,那么来自activesupport的constantizecamelifyunderscore方法可能非常有用。

答案 1 :(得分:2)

如果你正确地命名你的项目和部分,你可以尝试做类似下面代码的事情。

json.items @item.item_array do |item|
  json.partial! "api/#{item.class.to_s.pluralize.downcase}/show"
end

或者你可以在item.class.to_s上使用case语句,或者作为建议的其他答案之一,使用类实际类而不是类名作为字符串。