【问题标题】:Rails 5 - Activerecord association queryRails 5 - Activerecord 关联查询
【发布时间】:2023-03-11 23:24:02
【问题描述】:

我有两个相互关联的模型,如下所示。

class Comment < ApplicationRecord 
    belongs_to :user
end

class User < ActiveRecord::Base
    has_many :comments
end

以下记录查询

comments_list = Comment.where(:post_id => post_id, :is_delete => false).joins(:user).select('comments.*,users.*')

在 logger 中生成以下 mysql 查询

SELECT comments.*,users.* FROM `comments` INNER JOIN `users` ON `users`.`id` = `comments`.`user_id` WHERE `comments`.`post_id` = '81' AND `comments`.`is_delete` = 0.

这似乎生成了非常合法的查询,但 cmets_list 对象仅包含 cmets 表中的列。

谢谢

【问题讨论】:

    标签: mysql ruby-on-rails ruby activerecord


    【解决方案1】:

    这取决于您要做什么,如果您想在评论旁边显示用户名,Mert B. 的回答很好,您只需include(:user) 并且评论列表中的用户将当你做这样的事情时会被带走:

    comments_list = Comment.where(:post_id => post_id, :is_delete => false).joins(:user).select('comments.*,users.*')
    comments_list.each do |comment|
      puts "#{comment.text} by #{comment.user.name}"
    end
    

    或者,如果您只想要至少有一条评论的用户,您可以随时从 cmets 表的 user_ids 中选择用户:

    User.where(id: Comment.select(:user_id))
    

    【讨论】:

    • 是的@Macelo Risoli - 它有效,谢谢。所以这意味着如果我在控制器中执行此查询以将响应返回给客户端(浏览器),我必须转换结果,通过循环迭代构建另一个哈希
    • 第一个答案 - 最后一段 stackoverflow.com/questions/19175084/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多