Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 当通过Rails API提供JSON时,如何最小化查询?_Ruby On Rails_Json_Jbuilder_Rails Api - Fatal编程技术网

Ruby on rails 当通过Rails API提供JSON时,如何最小化查询?

Ruby on rails 当通过Rails API提供JSON时,如何最小化查询?,ruby-on-rails,json,jbuilder,rails-api,Ruby On Rails,Json,Jbuilder,Rails Api,我正在rails中准备一个API来提供AngularJS应用程序。该应用程序将提供一个仪表板,用于管理数据库中的人员,因此个人主页将获取大量信息。下面是我用来将信息格式化为JSON的Jbuilder文件: json.extract! @person, :id, :employee_id, :display_name json.appointments @person.appointments, :id, :jobcode, :title json.flags @person.flags, :id

我正在rails中准备一个API来提供AngularJS应用程序。该应用程序将提供一个仪表板,用于管理数据库中的人员,因此个人主页将获取大量信息。下面是我用来将信息格式化为JSON的Jbuilder文件:

json.extract! @person, :id, :employee_id, :display_name
json.appointments @person.appointments, :id, :jobcode, :title
json.flags @person.flags, :id, :name
json.source_relationships @person.source_relationships, :id, :source_id, :target_id, :relationship_type_id
json.target_relationships @person.target_relationships, :id, :source_id, :target_id, :relationship_type_id
返回的JSON如下所示(来自
/api/v1/people/1685.JSON
):

控制台将显示以下查询:

Person Load (0.1ms)  SELECT  `people`.* FROM `people`  WHERE `people`.`id` = 1685 LIMIT 1
Appointment Load (0.1ms)  SELECT `appointments`.* FROM `appointments`  WHERE `appointments`.`person_id` = 1685
Flag Load (0.1ms)  SELECT `flags`.* FROM `flags` 
    INNER JOIN `flags_people` ON `flags`.`id` = `flags_people`.`flag_id` WHERE `flags_people`.`person_id` = 1685
Relationship Load (0.1ms)  SELECT `relationships`.* FROM `relationships`  WHERE `relationships`.`source_id` = 1685
Relationship Load (0.1ms)  SELECT `relationships`.* FROM `relationships`  WHERE `relationships`.`target_id` = 1685

我喜欢JSON的格式,但它必须运行5个单独的查询,这一事实似乎效率低下。我尝试将
joins()
includes()
方法添加到活动记录查询中,该查询当前仅为:
@person=person.find(params[:id])
,但这似乎不是我想要的。如何在仍然以类似格式返回JSON的情况下干净地减少查询数量?

我正在寻找的方法是
eager\u load
。我不知道我以前是如何遇到它的,但它使用
左外部联接将所有表查询合并为一个查询

@person = Person.eager_load(:flags, :appointments,
:source_relationships, :target_relationships).find(params[:id])
此单一查询中的结果:

SELECT  DISTINCT `people`.`id` FROM `people` 
LEFT OUTER JOIN `flags_people` ON `flags_people`.`person_id` = `people`.`id` 
LEFT OUTER JOIN `flags` ON `flags`.`id` = `flags_people`.`flag_id` 
LEFT OUTER JOIN `appointments` ON `appointments`.`person_id` = `people`.`id` 
LEFT OUTER JOIN `relationships` ON `relationships`.`source_id` = `people`.`id` 
LEFT OUTER JOIN `relationships` `target_relationships_people` ON `target_relationships_people`.`target_id` = `people`.`id` 
WHERE `people`.`id` = 1685 LIMIT 1

上找到解释“似乎不是我想要的”是什么意思。很明显,你想要的是某种急切的加载。
Person.join(:flags,:约会,:source\u relationships,:target\u relationships)。find(params[:id])
(或者由于没有显示模型而可能出现的任何情况)与您想要的不同?优化和json格式与它们无关other@ptd-您建议的查询似乎正在将所有必需的表连接到
人员
表,但其他查询(
SELECT*FROM appoints
SELECT*FROM flags
等)仍在运行。这就是为什么我认为
joins()
不是我想要的方法。我在使用
includes()
时遇到了同样的情况。
SELECT  DISTINCT `people`.`id` FROM `people` 
LEFT OUTER JOIN `flags_people` ON `flags_people`.`person_id` = `people`.`id` 
LEFT OUTER JOIN `flags` ON `flags`.`id` = `flags_people`.`flag_id` 
LEFT OUTER JOIN `appointments` ON `appointments`.`person_id` = `people`.`id` 
LEFT OUTER JOIN `relationships` ON `relationships`.`source_id` = `people`.`id` 
LEFT OUTER JOIN `relationships` `target_relationships_people` ON `target_relationships_people`.`target_id` = `people`.`id` 
WHERE `people`.`id` = 1685 LIMIT 1