检查对象是否有一个或多个子节点的数据库有效方法是什么?

时间:2012-06-14 16:57:45

标签: ruby-on-rails

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

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

但是我宁愿不做这个涉及的数据库查找。有没有一种很好的方法来进行这种查询?

3 个答案:

答案 0 :(得分:2)

只需使用:counter_cache(http://asciicasts.com/episodes/23-counter-cache-column

答案 1 :(得分:2)

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

if @question.replies.present?

否则,您可以使用counter_cache列,该列只会维护您可以随时访问的问题表(replies_count)上的列。

答案 2 :(得分:0)

如果您有预先加载的关联,请使用present?方法

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?调用导致EXISTS检查,在找到第一个匹配行时返回,而不会产生从DB获取行数据的成本。

注意

其他选项是使用approach建议的counter_cache @dimuch。如果您可以更改数据库表结构,counter_cache解决方案是有效的。