json包含条件

我有问题来限制包含动态属性的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:船,:条件=> ...但有点烦躁。


我认为你最好的选择是在从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
链接地址: http://www.djcxy.com/p/6717.html

上一篇: json includes with conditions

下一篇: Async CTP and timeouts