2011-05-04 18 views
7

koşullar şunlardır ile içerir: Emin Raylar as_json dinamik özelliğe göre ben bir as_json kısıtlamak için problem

@pirates_ships = @current_account.pirates.as_json(:include => {:ships => {:only => [:id, :name]}}, :only => [:id, :last_name]) 

Bu

veya gemilerine olmadan bana tüm korsanları verir. Ayrıca, numaralı gemileri de gemilerle sınırlandırmam gerekir. Ben bunu çözmek çalıştı

ships.ocean_id koşullarla içerir:

pirates.includes(:ships).where("ships.ocean_id = ?", @ocean.id).as_json(...) 

kısıtlama çalışır, ancak şimdi bir gemi olmadan tüm korsanlar kaybolur. Ayrıca, kendi JOIN Syntax'ımla da hayır şansı yok.

Herhangi bir fikrin var mı? Ahoy

GÜNCELLEME

Benim çözümüm şimdiye kadar elle istekli yük etmektir. Benim dinamik koşullara sahip olabilir Bu şekilde: gemilerini varsa korsanlar ve her korsan için ekleyin:

@pirates = @current_account.pirates 
@ships = @current_account.ships.where({:pirate_id.in => @pirates, :ocean_id => @ocean.id}) 

render :json => { :pirates => @pirates.as_json(...), :ships => @ships.as_json(...) } 

Benim Ajax geri arama artık adımlayabilirsiniz. (JSON yanıtından görünümü oluşturmak için bir JS şablon altyapısı istemcisini kullanıyorum)

Durumumda çok zarif değil, performans önemli.

Daha iyi fikirler için hala açıkım. Dinamik has_many'yi denedim: gemiler,: koşullar => ... ama bu birazcık zor.

cevap

3

Bence en iyi bahsinizhash değerinin as_json 'dan üretilmesinin ardından değiştirilebileceğini düşünüyorum (çok sayıda varyasyon, vb. Denedim ve işe yaramadı).

+0

Bu, çalışır (oy verilir). Ama binlerce gemiyle korsanlar dünyasını hayal edin ve hala büyüyün. Şef arkadaşım, tek bir okyanusa rapor vermesi gereken her seferinde, tüm okyanuslardaki tüm gemileri saymak zorundaydı ... Bu bizim sql haritasındaki bir performans çarpması olurdu ;-) Baştan başlayarak temiz bir haritayı tercih ederim. – Xiaolong

+0

Arrgh! Hala oy kullanamam, yeni bir oyuncu olarak 15 itibarı yok. Afedersiniz!! – Xiaolong

+1

Kesinlikle optimize edilmemiş. Daha önce projelerimden birinde benzer bir sorun yaşadım ve bir seferde tüm JSON kayıtlarını elle oluşturmanın kısa bir yolunu buldum, bunu yapmanın iyi bir yolunu bulamadım. Neyse ki, veritabanım nispeten küçüktür, bu yüzden dizilerdeki yineleme benim için iyi çalıştı. –