Извлечь необработанный SQL, выполненный методами active_record, не отвечающими на to_sql - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь найти способ получить необработанный SQL, выполняемый методами активной записи, которые непосредственно выполняют запрос и не отвечают на to_sql.Например, find, find_by, take, pluck нельзя связать с помощью метода to_sql.

Как мне этого добиться?

1 Ответ

1 голос
/ 12 июня 2019

Это потому, что с помощью find и find_by вы получаете один объект или массив объектов, если вы передаете несколько идентификаторов, а не ActiveRecord :: Relation. С одним идентификатором вот что делает находка под капотом:

# 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

С помощью pluck вы получаете массив выбранных полей. Если вы хотите получить сырой sql, вы должны использовать where вместо find и find_all, ограничить вместо take и выбрать вместо 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...