Ruby on rails 什么';检查对象是否有一个或多个子对象是一种高效的数据库方法?

Ruby on rails 什么';检查对象是否有一个或多个子对象是一种高效的数据库方法?,ruby-on-rails,Ruby On Rails,我想检查对象是否包含一个或多个子对象: if @question.replies.count > 0 // do this else // do that end 但是,我不想做这个过程中涉及的db查找。有没有一种高效的查询方法?只需使用:counter\u cache()只需使用:counter\u cache()如果您已经通过include加载了回复,您可以使用@question.repress.length或@question.repress.size(更多信息)。您还可

我想检查对象是否包含一个或多个子对象:

if @question.replies.count > 0 
  // do this
else
  // do that
end

但是,我不想做这个过程中涉及的db查找。有没有一种高效的查询方法?

只需使用:counter\u cache()

只需使用:counter\u cache()

如果您已经通过
include
加载了回复,您可以使用
@question.repress.length
@question.repress.size
(更多信息)。您还可以将
if
语句简化为

if @question.replies.present?

否则,您可以使用
计数器缓存
列,该列只会在您的问题表中保留一列(
回复计数
),您可以随时访问该列。

如果您已经通过
包含
加载了回复,您可以使用
@question.repress.length
@question.repress.size
(更多信息)。您还可以将
if
语句简化为

if @question.replies.present?

否则,您可以使用
计数器\u缓存
列,该列只会在您的问题表(
回复数
)上保留一列,您可以随时访问该列。

如果您有急切加载的关联,则使用
呈现?
方法

class User
  has_many :messages
end

class Message
  belongs_to :user
  has_many   :replies
end

current_user.messages.all(:include => :replies).each do |message|
  if message.replies.present?
  else
  end
end
如果尚未将关联加载到内存,请使用
exists?
方法

current_user.messages.each do |message|
  if message.replies.exists?
  else
  end
end
exists?
调用将导致检查,该检查在找到第一个匹配行时返回,而不会产生从DB获取行数据的成本

注意


另一种选择是按照的建议使用
计数器\u缓存
计数器\u缓存
解决方案是有效的,如果您可以更改数据库表结构。

如果您有急切加载的关联,则使用
呈现?
方法

class User
  has_many :messages
end

class Message
  belongs_to :user
  has_many   :replies
end

current_user.messages.all(:include => :replies).each do |message|
  if message.replies.present?
  else
  end
end
如果尚未将关联加载到内存,请使用
exists?
方法

current_user.messages.each do |message|
  if message.replies.exists?
  else
  end
end
exists?
调用将导致检查,该检查在找到第一个匹配行时返回,而不会产生从DB获取行数据的成本

注意


另一种选择是使用所建议的
计数器缓存
计数器缓存
解决方案是有效的,如果您可以更改DB表结构。

我不确定这是否是最有效的,但您可以这样做(在Rails语法方面):
@question.repress.limit(2)
这样最多返回2个项目。这将使查询更小/更快。我不确定这是否是最有效的,但您可以这样做(在Rails语法方面):
@question.repress.limit(2)
因此最多返回2项。这将使查询更小/更快。谢谢-这是一个很好的答案。答案非常完整,我想将其标记为正确答案,但@dimuch的counter\u cache引用实际上是最有用的。您能点名检查他的引用,我将其标记为正确-谢谢-这是一个很好的答案答案。它太完整了,我想把它标记为正确的答案,但是@dimuch的counter\u cache引用实际上是最有用的。你能点名检查他的引用,我会把它标记为正确的-ty吗