2011-05-04 55 views
7

我有問題限制了as_json包括通過動態屬性:Rails的as_json包括與條件

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

這肯定給了我所有的海盜帶或不帶自己的船隻。

但我也需要限制船隻的例如。 ships.ocean_id

我試圖解決它包含與條件:

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

的限制的作品,但現在沒有一艘船所有海盜都將丟失。

也沒有運氣與我自己的JOIN語法。

任何想法? 嗨

UPDATE

我的解決方案到目前爲止是手動急切裝載。這樣我可以有我的動態條件:

@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(...) } 

我的Ajax回調現在可以遍歷:海盜,並添加每個海盜他的船如果有的話。 (我使用JS模板引擎clientside從JSON響應生成視圖)

不是很優雅,但性能對我來說很重要。

我仍然打開更好的想法。 我試過動態has_many:船,:條件=> ... 但這有點煩躁。

回答

3

我認爲你最好的選擇是在as_json(我嘗試了多種包含等變體並且無法獲取任何東西)後改變@pirates_ships哈希值。

@pirates_ships = @current_account.pirates.as_json(:include => :ships) 
@pirates_ships.each do |pirate| 
    pirate[:ships].delete_if{ |ship| ship.ocean_id != @ocean.id } 
end 

# Now, @pirates_ships should contain ALL pirates, as well as ships for @ocean 
+0

這是有效的(投票)。但想象一下擁有數千艘船隻的海盜世界仍在不斷壯大。我的主要隊友需要統計所有海洋上的所有船隻,每次他必須報告一個海洋......這將是我們的SQL地圖上的性能打擊;-)我從一開始就更喜歡乾淨的地圖。 – Xiaolong 2011-05-04 19:21:41

+0

Arrgh!我仍然不能投票,我缺乏作爲新手的聲望。抱歉!! – Xiaolong 2011-05-04 19:22:39

+1

這絕對沒有優化。我之前在其中一個項目上遇到過類似的問題,並且一次無法手動生成所有JSON記錄,但我無法想出一個這樣做的好方法。幸運的是,我的數據庫相對較小,因此對陣列的迭代對我來說工作得很好。 – 2011-05-04 19:24:08