Это потому, что с помощью 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