gpt4 book ai didi

ruby-on-rails - Rails as_json 包含条件

转载 作者:行者123 更新时间:2023-12-04 05:57:34 24 4
gpt4 key购买 nike

我在通过动态属性限制 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 响应生成 View )

不是很优雅,但性能对我来说很重要。

我仍然愿意接受更好的想法。
我试过动态 has_many :ships, :conditions => ...
但这有点繁琐。

最佳答案

我认为你最好的选择是改变 @pirates_shipsas_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

关于ruby-on-rails - Rails as_json 包含条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5887095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com