Ruby on rails 有没有办法检查ActiveRecord查询返回的空数组?

Ruby on rails 有没有办法检查ActiveRecord查询返回的空数组?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我想编写一个activerecord查询,其行为如下: User.joins(:comment).where(comments: {replies: []}) 返回其评论没有回复的用户 User.first.comment.first.replies => [] returns an empty array 我只需要这是一个activerecord关系,所以使用ruby代码是行不通的。有没有办法使用activerecord检查空数组 编辑: 示例模式 create_table "use

我想编写一个activerecord查询,其行为如下:

User.joins(:comment).where(comments: {replies: []})
返回其评论没有回复的用户

User.first.comment.first.replies => [] returns an empty array
我只需要这是一个activerecord关系,所以使用ruby代码是行不通的。有没有办法使用activerecord检查空数组

编辑: 示例模式

create_table "users", force: :cascade do |t|
t.string "email",
t.string "password"
end

create_table "comments" do |t|
t.string "content"
end

create_table "replies" do |t|
t.string "content"
end
User.rb

class User < ActiveRecord::Base
has_many :comments
end
Comment.rb

class Comment < ActiveRecord::Base
belongs_to :user
has_many :replies
end
答复.rb

class Reply < ActiveRecord::Base
belongs_to :comment
belongs_to :user
end
这些只是示例模型,但这应该说明与此相关的模型的问题


因此,如果一个id为1的用户发表了3条评论,而这3条评论中只有1条有回复,那么如何在activerecord关系中获得其他2条评论?

您可以通过使用计数器缓存来简化设计

在回复中添加计数器缓存

class Reply < ActiveRecord::Base
belongs_to :comment, counter_cache: true
belongs_to :user
end
回复数的简单使用条件

User.joins(:comment).where(comments: {replies_count: 0})

有关更多信息,请参阅

您可以使用计数器缓存使设计更简单

在回复中添加计数器缓存

class Reply < ActiveRecord::Base
belongs_to :comment, counter_cache: true
belongs_to :user
end
回复数的简单使用条件

User.joins(:comment).where(comments: {replies_count: 0})
有关更多信息,请参阅

您需要使用从评论到回复的左连接,该连接将返回所有评论,而不管每个评论是否都有回复。rails中常见的连接,即当您执行@comment.repress或User.joinscomments::repress时执行的连接是一个内部连接。ActiveRecord没有一个用于编写左连接查询的漂亮DSL,但它允许以以下方式进行查询:

# Find all users who have at least one comment with no replies
User.joins(:comments)
  .joins("LEFT JOIN replies ON replies.comment_id = comments.id")
  .where("replies.id IS NULL")

# Find all comments for a user that don't have replies
@user.comments
  .joins("LEFT JOIN replies ON replies.comment_id = comments.id")
  .where("replies.id IS NULL")
我之所以包含这两个片段,是因为在你的问题中,不清楚你是否想找到某个用户的用户或评论,而没有回复

User.first.comment.first.replies => [] returns an empty array
wherereplies.id为NULL是一个筛选器,它查找左侧联接中没有匹配答复的所有注释,并提供所需的结果。这是一个非常常见的SQL技巧,值得在以后的数据挖掘中牢记。

您需要使用从注释到回复的左连接,该连接将返回所有注释,而不管每个注释是否都有回复。rails中常见的连接,即当您执行@comment.repress或User.joinscomments::repress时执行的连接是一个内部连接。ActiveRecord没有一个用于编写左连接查询的漂亮DSL,但它允许以以下方式进行查询:

# Find all users who have at least one comment with no replies
User.joins(:comments)
  .joins("LEFT JOIN replies ON replies.comment_id = comments.id")
  .where("replies.id IS NULL")

# Find all comments for a user that don't have replies
@user.comments
  .joins("LEFT JOIN replies ON replies.comment_id = comments.id")
  .where("replies.id IS NULL")
我之所以包含这两个片段,是因为在你的问题中,不清楚你是否想找到某个用户的用户或评论,而没有回复

User.first.comment.first.replies => [] returns an empty array

wherereplies.id为NULL是一个筛选器,它查找左侧联接中没有匹配答复的所有注释,并提供所需的结果。这是一个非常常见的SQL技巧,值得在将来的数据挖掘中牢记。

请发布注释表的模式好吗?我使用的模型只是示例,但如果有帮助的话,我可以用这些模型创建一个示例模式。我最想了解的是“回复”列及其存储方式/如果我误解了,它是另一个表。我可以给你一个简单的例子来说明如何暂时让它工作,但是为了得到最佳的方法,我需要更多的关于数据是如何存储的。编辑:获取模型结构和表的关联方式也很好。当然,请给我几分钟时间,我将编辑inIs there和ActiveRecord::Relation(注释和回复之间定义的关系),即注释模型中有多个:回复?或者回复是存储为array/JSON的注释列?请发布注释表的模式好吗?我使用的模型只是示例,但如果有帮助的话,我可以用这些模型创建一个示例模式。我最想了解的是“回复”列及其存储方式/如果我误解了,它是另一个表。我可以给你一个简单的例子来说明如何暂时让它工作,但是为了得到最佳的方法,我需要更多的关于数据是如何存储的。编辑:获取模型结构和表的关联方式也很好。当然,请给我几分钟时间,我将编辑inIs there和ActiveRecord::Relation(注释和回复之间定义的关系),即注释模型中有多个:回复?或者回复是存储为array/JSON的注释列?