Ruby on Rails ActiveRecord Where查询结果判断失效求助
问题分析与解决方案
嗨,我来帮你理清楚这个问题~
你遇到的核心问题是:你的send_post_action_email方法返回的是ActiveRecord::Relation对象(也就是查询语句的封装),而不是布尔值。在Ruby里,只要不是nil或者false,任何对象在条件判断中都会被视为true——哪怕这个查询结果是空的,关系对象本身依然是“真值”,所以你的if条件永远会成立,这就是判断不生效的原因。
下面给你两种可行的解决办法:
方法一:修改模型方法,直接返回布尔值(推荐)
按照Rails的命名惯例,返回布尔值的方法通常以?结尾,可读性更强。你可以把模型方法改成这样:
def send_post_action_email? ProjectEmailLogs.exists?(project_id: self.project.id) end
然后在控制器里这样使用:
if order.send_post_action_email? # Do Stuff end
exists?方法会直接向数据库发送一个EXISTS查询,只检查是否存在匹配记录,不需要加载整个数据集,性能更优。
方法二:不修改模型方法,在判断时添加存在性检查
如果你不想改动模型里的方法,也可以在控制器的条件判断中,对查询结果调用exists?或any?来判断:
# 推荐用exists?,性能更好 if order.send_post_action_email.exists? # Do Stuff end # 或者用any?(会加载记录到内存后判断) if order.send_post_action_email.any? # Do Stuff end
你之前说试过any没解决,应该是漏写了问号,正确的写法是any?而不是any哦。
另外补充个小建议:你的方法名send_post_action_email有点容易误导人,看起来像是要执行发送邮件的操作,但实际是检查日志是否存在。如果改成post_action_email_log_exists?这类名字,会更符合语义,其他开发者一看就懂~
内容的提问来源于stack exchange,提问作者Aaron A
相关产品推荐
相关产品推荐

