Activerecord find_by_sql не выводит результаты SQL-запроса - PullRequest
0 голосов
/ 30 января 2012

Я использую activerecord и find_by_sql для вывода результатов запроса sql:

S = Object.find_by_sql("SELECT * FROM foo")
S.each do |s|
  puts "#{s}"
end

Я получаю

#<Object:0x0000010214d5e0>
#<Object:0x0000010214ce60>

и т.д ...

Мне нужны реальные результаты.

Заранее спасибо

Оценка

Ответы [ 4 ]

3 голосов
/ 30 января 2012

Функция ActiveRecord find_by_sql ожидает, что запрос вернет значения из базовой таблицы класса, для которого он был вызван.Например, если у вас есть класс с именем Foo (с базовой таблицей foos с столбцами bar и baz), вы можете сделать это:

Foo.find_by_sql("select * from foos").each do |record|
    puts "Got a Foo: bar=#{record.bar}, baz=#{record.baz}"
end

Если проблема заключается в том, что вы надеваетевам не нравится вывод, который вы получаете, когда пытаетесь распечатать объект (#<Object:0x0000010214d5e0>), тогда вам нужно только создать метод to_s для вашего класса:

class Foo < ActiveRecord::Base
    def to_s
        "Foo bar=#{record.bar}, baz=#{record.baz}"
    end
end

С другой стороны, не надоНапечатайте объект напрямую ("#{s}"), используйте inspect:

puts s.inspect
2 голосов
/ 30 января 2012

Если вы хотите получить необработанные необработанные данные из произвольного запроса SQL, вам следует использовать select_rows, то есть:

SomeModel.connection.select_rows('select * from foo').each do |row|
    # `row` is an array of strings at this point
    puts row.join(', ')
end

Вам придется самостоятельно разбирать преобразования типов и тому подобное, но иногда все механизмы ActiveRecord просто мешают, чтобы вы могли работать с необработанным SQL и результатами по мере необходимости.

0 голосов
/ 30 января 2012

puts преобразует объект ruby ​​в строку, вызывая метод to_s для объекта.
По умолчанию to_s печатает класс объекта и кодировку идентификатора объекта.Чтобы напечатать читаемую человеком форму объекта, используйте inspect

locs = Location.find_by_sql('select * from locations')
  Location Load (0.5ms)  select * from locations


locs.each do |l|
  # it calls to_s method on object
  puts l
end

#<Location:0x000000055bb328>
#<Location:0x000000055bb058>

locs.each do |l|
  puts l.inspect # prints actual object
end

#<Location id: 15, name: "Annettaside3", street: "71838 Ritchie Cape", city: "East Destanystad", state: "Utah", zip: "58054", phone: 123456, other_phone: 987654, staff_strength: 40, is_active: true, created_at: "2012-01-25 11:17:26", updated_at: "2012-01-25 11:17:26", country_name: "Korea">
#<Location id: 16, name: "Sporerbury4", street: "73057 Jerad Shoal", city: "South Kyliefurt", state: "Delaware", zip: "46553-3376", phone: 123456, other_phone: 987654, staff_strength: 40, is_active: true, created_at: "2012-01-25 11:24:48", updated_at: "2012-01-25 11:24:48", country_name: "Australia">
0 голосов
/ 30 января 2012

Для этого объекта нет метода to_s. Вы можете попробовать puts s.inspect или p s вместо

...