2016-03-29 26 views
1

Raylarım uygulamasında bir model (FirstModel) uygulamasının başka bir modelle (Öğe) has_many ilişkisi vardır.Farklı sınıflara sahip nesneler dizisi oluşturmak için raydaki jbuilder'i kullanma

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 

Öğenin kendisi: bir polimorfik ilişkiden öğe. FirstModel'deki bir yöntem, birleştirme öğesi nesnesini (sınıf Öğesi olan) değil, her Öğe nesnesinin item_thing öğesini değil, bir "öğe" dizisini döndürür ve bu nedenle farklı sınıfların nesnelerinin bir dizisidir (raylar konsolunda kontrol edilir, ve yöntem FirstModel benim show.json.jbuilder olarak gayet dizi)

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


end 

döner, ben "öğeleri" o diziyi alıp öğenin ait olduğu sınıf dayalı farklı şablonlar kullanmak istiyorum. Aşağıdaki dosya yolu "görüntüleme/API/ürün/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 

araba ve kitap şablon yolları "görüntüleme/API/Arabalar/show.json.jbuilder" ve "görüntüleme/API/kitaplar olduğunu /show.json.jbuilder

Yukarıdaki şablondan json'u aldığımda, FirstModel nesnesinin adı görünür olurken, öğeler dizisi boştur, oysa ben, her öğe için bir dizi karmaşayı elde etmeye çalışıyorum. kendi ilgili şablonu.

yardımcı olduğunuz için teşekkür ederiz!

cevap

2

bence sen sınıf dizelerinizi gerçek sınıf adlarına değiştirirseniz r kodu çalışır.

I.I.I.e. User ve .

Ya da dizeleri saklayabilir ve kullanıcı kaydı için döndüren .class.to_s'u kullanabilirsiniz.

Metaprogramming ile ilgileniyorsanız, constantize, camelify ve underscore yöntemlerinin etkinleştirilmiş olması, hattın altından faydalı olabilir.

2

Öğelerinizi ve kısmi öğelerinizi doğru bir şekilde adlandırarak, yalnızca aşağıdaki kod gibi bir işlem yapabilirsiniz.

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

Alternatif item.class.to_s bir vaka deyimi kullanabilirsiniz veya başka cevaplar biri önerildiği gibi, bir dize olarak sınıf adı yerine sınıf fiili sınıfını kullanın.

İlgili konular