调用to_json时如何应用WHERE过滤器保留:includes

时间:2014-11-13 21:36:50

标签: ruby-on-rails ruby json

我有以下Ruby + Rails代码

render :json =>  enterprise.to_json(:include => { :v3_passengers => { :include => [:cost_center, :restrictions]}})

我需要使用v3_passengers模型的一个字段应用WHERE过滤器,然后再将其渲染为json(例如“where v3_passenger.id = 2345”)

我试过这个

render :json => enterprise.includes(:v3_passengers).where(enterprise_country: Thread.current['CurrentBehaviour'].COUNTRY).includes(:cost_center, :restrictions).to_json

但是不起作用,我已经看过如何实现这一目标的任何看法。

更新

这就是模型的相关方式

class Enterprise < ActiveRecord::Base
    has_many :v3_passengers


class V3Passenger < GlobalDB
    has_many :restrictions
    belongs_to :cost_center

4 个答案:

答案 0 :(得分:3)

1。首先,您需要按joinsincludes

进行过滤
foo = enterprise.joins(:v3_passengers).where(v3_passengers: {enterprise_country: Thread.current['CurrentBehaviour'].COUNTRY})

或(首选包含,因为您将需要v3_passengers

foo = enterprise.includes(:v3_passengers).where(v3_passengers: {enterprise_country: Thread.current['CurrentBehaviour'].COUNTRY})

2。然后在to_json

include您需要的其他节点
foo.to_json(include: [v3_passengers: { include: [:cost_center, :restrictions] } ])

最终结果:

render :json => enterprise.joins(:v3_passengers).where(v3_passengers: {enterprise_country: Thread.current['CurrentBehaviour'].COUNTRY}).to_json(include: [v3_passengers: { include: [:cost_center, :restrictions] } ])

答案 1 :(得分:3)

问题在于:

model.includes(:other_model).to_json

不同于:

model.to_json(include: :other_model)

因此,您的第一次尝试是在输出中为您提供Enterprise,V3Passenger,Restriction和CostCenter的所有字段。您的第二次尝试只是为您提供企业领域。

一个可能的解决方案是:

enterprise.joins(:v3_passengers).where("v3_passengers.id=?",2345).to_json(include: :v3_passengers)

(当然包括其他表格。)

这将为所有拥有v3_passengers.id = 2345的企业提供JSON,包括所有V3Passengers的JSON(即使是没有id 2345的V3Passengers)。

如果您只想包含与where子句匹配的V3Passengers,则需要向模型添加范围关联:

has_many :v3_passengers_where_id_2345, -> { where id: 2345 }

然后在进行JSON转换时使用该关联:

enterprise.joins(:v3_passengers).where("v3_passengers.id=?",2345).to_json(include: :v3_passengers_where_id_2345)

这将为拥有v3_passengers.id = 2345的企业提供JSON,仅包括身份为2345的V3Passengers。

答案 2 :(得分:1)

第二个镜头接近工作变体。

render :json => enterprise.v3_passengers.where(enterprise_country: Thread.current['CurrentBehaviour'].COUNTRY).includes(:cost_center, :restrictions).to_json

尝试使用某种关系。 如需更清晰的答案,请添加您的主要型号列表,Enterprice和乘客型号。

答案 3 :(得分:1)

如果您需要生成的json中的企业属性:

render :json => enterprise.joins(:v3_passengers).where("v3_passengers.enterprise_country = ?", Thread.current['CurrentBehaviour'].COUNTRY).to_json(include: [v3_passengers: { include: [:cost_center, :restrictions] } ])

如果你只需要乘客:

render :json => enterprise.v3_passengers.where(enterprise_country: Thread.current['CurrentBehaviour'].COUNTRY).includes(:cost_center, :restrictions).to_json( include: [:cost_center, :restrictions])