【问题标题】:How to convert records including 'include' associations to JSON如何将包括“包含”关联的记录转换为 JSON
【发布时间】:2026-01-27 07:00:02
【问题描述】:

如果我这样做:

result =  Appointment.find( :all, :include => :staff )
logger.debug { result.inspect }

然后它只打印出约会数据,而不是相关的员工数据。 如果我做 result[0].staff.inpsect 那么我当然会得到员工数据。

问题是我想把它作为 JSON 返回给 AJAX,包括员工行。如何强制它包含员工行,或者我必须循环并手动创建一些东西?

【问题讨论】:

    标签: ruby-on-rails ajax activerecord


    【解决方案1】:

    :includeto_json 的参数,而不是 find。您需要在控制器中执行以下操作:

    def return_json
      @appointment = Appointment.find(:all)
      respond_to { |format|
        format.json { render :json => @appointment.to_json(:include => :staff) }
      }
    end
    

    您需要在 Appointment 和 Staff 之间建立关联才能使其正常工作。

    【讨论】:

    • :include 是 ActiveRecord::Base#find 和 ActiveRecord::Serialization#to_json 的参数。它们做不同的事情:#find(:include) 在一个或多个 SQL 查询中加载关联数据,而不是可怕的 N+1 查询。 #to_json(:include) 标记一个或多个关联以包含在返回的 JSON 对象中。 #to_xml 的行为方式相同。
    • @AlexKorban 谢谢!如果员工同样有一个您想包含在 JSON 中的父级,您将如何包含它?基本上我想得到:'@appointment.staff.manager.name
    【解决方案2】:

    查看 ActiveRecord::SerializationActionController::Base(请参阅“渲染 JSON”部分)

    def show
      @appointment = Appointment.find(:all, :include => :staff)
      respond_to do |format|
        format.html
        format.js { render :json => @appointment.to_json(:methods => [:staff]) }
      end
    end
    

    【讨论】:

      最近更新 更多