【问题标题】:Automated way to select all columns of joined table in ActiveRecord?自动选择ActiveRecord中连接表的所有列的方法?
【发布时间】:2011-05-26 17:25:24
【问题描述】:

想知道升级到 Arel,如果 ActiveRecord 还支持从连接表中选择列的自动方式,而不必在选择子句中明确列出它们。

鉴于我将users 表加入posts,希望能够以更简洁的方式执行此类操作:

  scope :select_user,
    select("posts.*, " + User.columns.map{|c| 
      "users.#{c.name} user_#{c.name}"}.join(','))

所以,我想自动选择用户的字段以便我说

Post.joins(:user).select_user.first.user_name

【问题讨论】:

    标签: ruby-on-rails activerecord arel


    【解决方案1】:

    我认为你在这里真正想要的是使用includes,如果你想在查询完成后访问关联的属性。所以同样的查询是

    Post.includes(:user).first.user.name
    

    这将导致两个查询,一个select * from users 和一个select * from posts where posts.user_id in (id1, id2, id3...)(假设post belongs_to user)在特定情况下可能会影响性能,但从语法的角度来看可能是值得的。在某些情况下,它甚至可能更快Rails :include vs. :joins

    如果您在查询中添加限制运算符,Arel 也会智能地使用join,例如Post.includes(:user).where('users.name = "Bo Bob"') 将使用 join 进行一次查询,并且还使您能够在生成的 Post 对象上使用关联。

    【讨论】:

    • github.com/ntalbott/query_trace 在开发时非常有用,可以查看每个 rails 命令生成的 sql 查询。
    • 我的问题其实是如何选择所有加入的post和user的字段,而且有些字段名是一样的。 post.name 和 user.name
    【解决方案2】:

    如果我正确理解了您的问题,您可以使用“joins”:

    class Post < ActiveRecord::Base
      belongs_to :user
    
      scope :select_user, joins(:user).where('users.name = "Mary"')
      ...
    end
    

    或带参数:

    class Post < ActiveRecord::Base
      belongs_to :user
    
      scope :select_user, lambda {|user_name|
        joins(:user).where('users.name = ?', user_name)
      }
      ...
    end
    

    【讨论】:

    • 感谢您的回答。我没有显示连接——问题更多是关于如何从连接表中自动选择字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    相关资源
    最近更新 更多