2016-03-29 7 views
1

私のレールアプリのモデル(FirstModel)は他のモデル(Item)とhas_many関係にあります。レールでjbuilderを使用して異なるクラスのオブジェクトの配列を構築する

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 

アイテム自体が以下のものです:item_thingから多形関連。 FirstModelのメソッドは、Joinモデルオブジェクト(Itemクラス)ではなくitemsオブジェクトの配列を返します。したがって、クラスの異なるオブジェクトの配列です(rails console、そしてこの方法はFirstModelのための私のshow.json.jbuilderでうまく配列)

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


end 

を返し、私は「アイテム」の配列を取得し、アイテムが属するクラスに基づいて異なるテンプレートを使用します。次のファイル・パス "ビュー/ API /アイテム/ show.jbuilder"

ある
json.extract! @item, :name 

json.items @item.item_array do |item| 
    if item.class == 'Book' 
    json.partial! 'api/books/show', item 
    end 
    if item.class == 'Car' 
    json.partial! 'api/cars/show', item 
    end 
end 

車とブックテンプレートのパスは、 "ビュー/ API /車/ show.json.jbuilder" と「ビュー/ API /冊です/show.json.jbuilder。

上記のテンプレートからjsonを取得すると、FirstModelオブジェクトの名前が表示され、items配列は空ですが、各アイテムのハッシュの配列を取得しようとしていますそれぞれのテンプレート

答えて

2

私はあなたがあなたのクラス文字列を実際のクラス名に変更すると、rコードが動作します。

I.e. Userで、ではありません。

または、文字列を保持して.class.to_sを使用すると、ユーザーレコードとしてが返されます。

メタプログラミングに興味があるなら、activesupportのconstantizecamelifyunderscoreの方法が役に立つかもしれません。

2

あなたの商品や部分品に正しく名前を付けると、次のようなことが可能になります。

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

は、別の方法としては、item.class.to_sにcase文を使用することができ、または他の回答の一つが示唆したように、文字列としてクラス名ではなく、クラスの実際のクラスを使用します。

関連する問題