我想检查某个对象是否包含一个或多个子项:
if @question.replies.count > 0
// do this
else
// do that
end
但是我宁愿不做这个涉及的数据库查找。有没有一种很好的方法来进行这种查询?
答案 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
解决方案是有效的。