【发布时间】:2011-08-18 17:29:52
【问题描述】:
我无法通过动态属性限制 as_json 包含:
@pirates_ships = @current_account.pirates.as_json(:include => {:ships => {:only => [:id, :name]}}, :only => [:id, :last_name])
这肯定给了我所有有船或没有船的海盗。
但我还需要限制船只,例如ship.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 回调现在可以遍历 :pirates 并为每个海盗添加他的船(如果有)。 (我使用 JS 模板引擎客户端从 JSON 响应生成视图)
不是很优雅,但对我来说性能很重要。
我仍然愿意接受更好的想法。 我试过动态 has_many :ships, :conditions => ... 但这有点繁琐。
【问题讨论】:
标签: ruby-on-rails json include conditional