Я использовал активную запись, чтобы получить мои истории, а затем создать CSV, стандартный способ, как это делается в рельсах. Но у меня много строк, и для этого требуется несколько минут. Я думаю, если бы я мог получить posgresql для выполнения рендеринга csv, я мог бы сэкономить некоторое время.
Вот что я имею прямо сейчас:
query = "COPY stories TO STDOUT WITH CSV HEADER;"
results = ActiveRecord::Base.connection.execute(query);
Но результаты для этого запроса пустые:
=> #<PG::Result:0x00000006ea0488 @connection=#<PG::Connection:0x00000006c62fb8 @socket_io=nil, @notice_receiver=nil, @notice_processor=nil>>
2.0.0-p247 :053 > result.count
=> 0
Лучший способ узнать:
2.0.0-p247 :059 > result.to_json
=> "[]"
Я подозреваю, что мой контроллер будет выглядеть примерно так:
format.csv { send_data raw_results }
Это работает для обычных запросов, я просто не могу понять синтаксис SQL, чтобы результаты CSV возвращались на рельсы.
UPDATE
Получил экспорт CSV с 120000 мсек до 290 мсек
Моя модель:
def self.to_csv(story_ids)
csv = []
conn = ActiveRecord::Base.connection.raw_connection
conn.copy_data("COPY (SELECT * FROM stories WHERE stories.id IN (#{story_ids.join(',')})) TO STDOUT WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *, ESCAPE E'\\\\');") do
while row = conn.get_copy_data
csv.push(row)
end
end
csv.join("\r\n")
end
Мой контроллер:
send_data Story.to_csv(Story.order(:created_at).pluck(:id))