Ruby on rails 当通过Rails API提供JSON时,如何最小化查询?
我正在rails中准备一个API来提供AngularJS应用程序。该应用程序将提供一个仪表板,用于管理数据库中的人员,因此个人主页将获取大量信息。下面是我用来将信息格式化为JSON的Jbuilder文件: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
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