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吗