【问题标题】:Rails 3 Returning All Columns from a JoinRails 3从连接返回所有列
【发布时间】:2010-11-27 15:03:41
【问题描述】:

我正在尝试连接两个表并返回所有列,而不仅仅是与模型关联的列。

我有类似这样的东西:

Comment.joins(:user).select("*")

SQL 看起来不错,但它仍然只返回 cmets,没有任何与之关联的用户信息。

如何检索* 而不仅仅是comments.*

【问题讨论】:

    标签: ruby-on-rails join arel


    【解决方案1】:

    怎么样

    comments = Comment.includes(:user).all
    

    现在comments 将成为一个数组,因此您必须遍历它才能查看所有用户。

    #won't work
    comments.user 
    
    #should work
    comments[0].user
    
    comments.each do |comment|
        puts comment.user.name #or whatever
    end
    

    【讨论】:

    • 仍然无法显示用户信息。前往 Mishka's 帮我解决这个问题 ;)
    • 我已经起床太久了;)。这行得通。我想确保一切都被急切地加载。
    • 看起来 .all 最终不是必需的(至少对我而言)。使代码更简洁。
    【解决方案2】:

    这应该可行:

    comments = Comment.joins(:user).includes(:user)
    

    但这是我认为正在发生的事情,如果您在控制台窗口中查看输出,我认为控制台输出仅反映/检查返回的根级别对象。

    我刚刚做了一个实验,我执行了上面的代码。终端输出记录它获取了 cmets,但没有提及关联的用户。接下来,我关闭了数据库,以便无法对数据库执行第二个查询,然后询问关联的用户,例如

    comments.user
    

    控制台输出用户,证明已经被热切加载,因为没有尝试连接数据库。

    【讨论】:

    • 有趣。我想知道同样的事情。尽管查询缓存可能会让人感到困惑,但您也可能会注意到在执行 comments.user 时是否会触发查询。
    【解决方案3】:

    Comment.select('*').includes(:user)

    【讨论】:

    • 对 - 我不确定您是关心 SQL 还是只是在获取数据。在这种情况下,您无需返回数据库即可同时获得评论和用户。
    • 只做 Comment.select("Comments.*, Users.*")
    【解决方案4】:

    Ryan Bates 对此主题有很好的教程。

    http://railscasts.com/episodes/22-eager-loading-revised?autoplay=true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 2018-03-02
      • 1970-01-01
      • 2015-01-20
      • 2017-03-17
      • 2020-12-17
      • 2021-03-15
      • 2015-07-26
      相关资源
      最近更新 更多