2016-03-29 17 views
1

Ein Modell (FirstModel) in meiner Rails-App hat eine has_many-Beziehung zu einem anderen Modell (Item).Verwenden von Jbuilder in Rails zum Erstellen eines Arrays aus Objekten mit unterschiedlichen Klassen

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 

Element selbst gehört: item_thing durch eine polymorphe Assoziation. Eine Methode auf FirstModel gibt ein Array von "items" zurück, nicht das join-Modell-Objekt (das der Klasse Item angehört), sondern das item_thing jedes Item-Objekts und daher ein Array von Objekten verschiedener Klassen (in der rails-Konsole eingecheckt). und die Methode gibt das Array just fine)

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


end 

In meinem show.json.jbuilder für FirstModel, möchte ich, dass die Reihe von „items“ nehmen und verschiedene Vorlagen verwenden, basierend auf welcher Klasse das Objekt gehört. Der folgende Dateipfad ist "Ansichten/api/Artikel/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 

Das Auto und Buch-Vorlage Wege sind "Ansichten/api/Autos/show.json.jbuilder" und „Ansichten/api/Bücher /show.json.jbuilder.

Wenn ich den JSON von der obigen Vorlage bekomme, ist der Name des FirstModel-Objekts sichtbar, das Elementarray ist leer, während ich versuche, ein Array von Hashes für jedes durchgerenderte Element zu erhalten ihre jeweilige Vorlage.

Vielen Dank für ihre Hilfe!

Antwort

2

ich glaube, Sie R-Code funktioniert, wenn Sie Ihre Klassenzeichenfolgen in tatsächliche Klassennamen ändern.

I.e. User und nicht .

Oder Sie könnten die Zeichenfolgen beibehalten und .class.to_s verwenden, die für einen Benutzerdatensatz zurückgeben wird.

Wenn Sie sich für Metaprogrammierung interessieren, könnten die Methoden , camelify und underscore von activesupport nützlich sein.

2

Sie können wahrscheinlich so etwas wie den folgenden Code tun, wenn Sie Ihre Artikel und Teiltöne richtig benennen.

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

Alternativ könnten Sie eine Case-Anweisung auf item.class.to_s verwenden oder als eine der anderen Antworten vorgeschlagen, verwenden Sie die Klasse eigentliche Klasse anstelle des Klassennamen als String zurück.