Rails技术问题:如何对select查询使用.to_sql查看SQL语句
问题解决:NoMethodError: undefined method 'to_sql'
错误原因
你当前的代码用了Ruby数组的select方法(带块形式):
Post.all.select { |p| Date.today < p.created_at.weeks_since(2) }
当Post.all调用带块的select时,会立即执行SQL查询,把所有Post记录加载到内存中转换成Ruby数组。而数组对象并没有to_sql方法,所以触发了NoMethodError。
正确写法
要生成可查看SQL的ActiveRecord查询,需要用ActiveRecord的数据库层面查询方法(而非内存过滤),让查询逻辑在数据库端执行。推荐两种写法:
写法1:使用where配合占位符
post_query = Post.where('created_at > ?', 2.weeks.ago) # 查看SQL puts post_query.to_sql
写法2:使用范围查询(更Ruby化)
post_query = Post.where(created_at: 2.weeks.ago..) # 查看SQL puts post_query.to_sql
这两种写法生成的都是ActiveRecord::Relation对象,它支持to_sql方法,可以直接输出对应的SQL语句,同时查询逻辑在数据库端执行,性能远优于先加载所有数据到内存再过滤。
内容的提问来源于stack exchange,提问作者isMattCoding
相关产品推荐
相关产品推荐

