【问题标题】:How do I get Rails ActiveRecord to generate optimized SQL?如何让 Rails ActiveRecord 生成优化的 SQL?
【发布时间】:2012-03-28 15:16:47
【问题描述】:

假设我有 4 个模型,它们通过以下方式相关:

  • 计划具有项目的外键
  • 计划具有用户的外键
  • 项目对客户有外键

在我的 Schedule#index 视图中,我想要最优化的 SQL,以便我可以显示与 Schedule 相关的项目、客户和用户的链接。所以,我不应该拉出项目、客户和用户的所有列;只有他们的 ID 和姓名。

如果我要手动编写 SQL,它可能如下所示:

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. # ?

我已经在模型中设置了关联(即 has_many / belongs_to)。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    我认为这将建立(或至少帮助)你得到你正在寻找的东西:

    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`
    

    我在您的方法中看到的主要问题是您正在寻找计划对象,但您的初始“FROM”子句基于“用户”,并且您给出的关联也在计划中,所以我基于平原构建了这个解决方案假设你想要时间表!

    我也没有包括你所有的选择来节省一些打字,但你明白了。您只需添加具有完整表名的每一个。

    【讨论】:

    • 正确,我想要时间表。内部连接的顺序与我在使用的工具(复合信息服务器)中链接表的顺序有关。无论如何,您的回答非常棒!让我失望的一件事......如果我在选择中使用列别名,它们不会出现在@schedules.first.inspect 上,但它们在那里(即@schedules.first.client_name)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多