Ruby on rails 如何让Rails ActiveRecord生成优化的SQL?
假设我有4个模型,它们以以下方式相互关联: 进度表具有项目的外键 计划对用户具有外键 项目具有客户端的外键 在Scheduleindex视图中,我希望使用最优化的SQL,以便显示与计划关联的项目、客户端和用户的链接。因此,我不应该为项目、客户机和用户提取所有列;只有他们的ID和名字 如果我手动编写SQL,它可能如下所示:Ruby on rails 如何让Rails ActiveRecord生成优化的SQL?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,假设我有4个模型,它们以以下方式相互关联: 进度表具有项目的外键 计划对用户具有外键 项目具有客户端的外键 在Scheduleindex视图中,我希望使用最优化的SQL,以便显示与计划关联的项目、客户端和用户的链接。因此,我不应该为项目、客户机和用户提取所有列;只有他们的ID和名字 如果我手动编写SQL,它可能如下所示: select s.id, s.schedule_name, s.schedule_type, s.project_id, p.
select
s.id,
s.schedule_name,
s.schedule_type,
s.project_id,
p.name project_name,
p.client_id client_id,
c.name client_name,
s.user_id,
u.login user_login,
s.created_at,
s.updated_at,
s.data_count
from
Users u inner join
Clients c inner join
Schedules s inner join
Projects p
on p.id = s.project_id
on c.id = p.client_id
on u.id = s.user_id
order by
s.created_at desc
我的问题是:要让Rails 3生成SQL,ActiveRecord代码是什么样子的?例如,类似于:
@schedules = Schedule. # ?
我已经在模型中设置了关联,即有许多/属于这些关联。我认为这将建立或至少帮助您获得您想要的:
Schedule.select("schedules.id, schedules.schedule_name, projects.name as project_name").joins(:user, :project=>:client).order("schedules.created_at DESC")
应产生:
SELECT schedules.id, schedules.schedule_name, projects.name as project_name FROM `schedules` INNER JOIN `users` ON `users`.`id` = `schedules`.`user_id` INNER JOIN `projects` ON `projects`.`id` = `schedules`.`project_id` INNER JOIN `clients` ON `clients`.`id` = `projects`.`client_id`
我在您的方法中看到的主要问题是,您正在寻找schedule对象,但基于User和给定的关联的初始FROM子句也在计划中,因此我基于您想要计划的简单假设构建了此解决方案
我也没有包括你所有的选择,以节省一些打字,但你得到的想法。您只需添加每个符合其完整表名的表。正确,我需要时间表。内部联接的顺序与我在使用复合信息服务器的工具中链接表的顺序有关。不管怎样,你的答案很好!有件事把我甩了。。。如果我在select中使用列别名,它们将不会显示在@schedules.first.inspect上,但它们在那里,即@schedules.first.client_name