检索由active_record方法执行的未响应to_sql的原始SQL

时间:2019-06-12 11:31:01

标签: sql ruby-on-rails activerecord

我试图找到一种方法来检索由活动记录方法执行的原始SQL,这些方法直接执行查询并且不响应to_sql。 例如find, find_by, take, pluck不能与to_sql方法链接。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

这是因为,如果您传入多个ID而不是ActiveRecord :: Relation,则使用find和find_by会得到单个对象或对象数组。 有了一个id,这就是find在后台执行的操作:

# the record method processes the query and returns an array of Person instances
# because the limit(1) there will only be 1 instance
# with first you get the first item of the array
# there is no information about the query only a Person instance
Person.where(Person.primary_key => 1).limit(1).records.first

使用take,您将获得对象数组,而不是ActiveRecord :: Relation。

# Take does this under the hood
# if limit is set
limit(limit).to_a
# if limit is not set
limit(1).to_a

点击即可获得一组选定字段。如果您想获取原始SQL,则应使用where而不是find和find_all,请使用limit而不是take和select而不是pluck。

   # instead of Person.find(1)
   Person.where(id: 1).limit(1).to_sql
   # Or instead of Person.find([1, 2, 3])
   Person.where(id: [1, 2, 3]).to_sql
   # instead of Person.find_by(name: 'John Doe')
   Person.where(name: 'John Doe').limit(1).to_sql
   # instead of Person.where(salutation: 'Mr.').take(10)
   Person.where(salutation: 'Mr.').limit(10).to_sql
   # instead of Person.where(salutation: 'Mr.').limit(10).pluck(:name)
   Person.select(:name).where(salutation: 'Mr.').limit(10).to_sql