我有问题限制动态属性的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语法也没有运气。
有什么想法吗? 嗨
更新
到目前为止我的解决方案是手动加载。这样我就可以拥有自己的动态条件:
@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模板引擎clientide从JSON响应生成视图)
不是很优雅,但在我的情况下,表现很重要。
我仍然愿意接受更好的想法。 我试过动态的has_many:ships,:conditions => ... 但那有点繁琐。
答案 0 :(得分:3)
我认为你最好的选择是在@pirates_ships
生成as_json
之后更改@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
哈希(我尝试了多种包含等等,并且无法正常工作)。
{{1}}