我有以下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
答案 0 :(得分:3)
joins
或includes
: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})
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])