我试图找到一种方法来检索由活动记录方法执行的原始SQL,这些方法直接执行查询并且不响应to_sql
。
例如find, find_by, take, pluck
不能与to_sql
方法链接。
我该如何实现?
答案 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