برنامه نویسی

بارگیری CSV در ریل ها: یک راهنمای عملی

پخش پرونده های بزرگ CSV به طور مستقیم از برنامه ریل شما روشی کارآمد برای رسیدگی به صادرات داده ها ، به ویژه هنگام برخورد با مجموعه داده های بزرگ است. با پخش CSV ، از بارگیری کل مجموعه داده ها به حافظه خودداری می کنید ، که می تواند عملکرد را به میزان قابل توجهی بهبود بخشد. در این مقاله ، نحوه اجرای بارگیری های CSV را در یک برنامه ریل با استفاده از یک مدل پست عمومی به عنوان نمونه می گذرانیم.

مدل

بیایید با مدل پست شروع کنیم. این مدل مسئول تولید داده های CSV خواهد بود. در اینجا کد وجود دارد:

class Post < ApplicationRecord
  # Generates a CSV string in memory (for smaller datasets)
  def self.to_csv
    CSV.generate(headers: true) do |csv|
      csv << csv_headers
      find_each(batch_size: 1000) { |post| csv << csv_row(post) }
    end
  end

  # Streams CSV data directly to an output stream (e.g., HTTP response)
  def self.stream_csv_to(output_stream)
    output_stream.write CSV.generate_line(csv_headers)
    find_each(batch_size: 1000) do |post|
      output_stream.write CSV.generate_line(csv_row(post))
    end
  end

  # Defines the CSV headers
  def self.csv_headers
    csv_attributes.map { |attr| human_attribute_name(attr) }
  end

  # Generates a CSV row for a given post
  def self.csv_row(post)
    csv_attributes.map { |attr| post.send(attr) }
  end

  # Specifies the attributes to include in the CSV
  def self.csv_attributes
    %w[id title content author_name created_at updated_at]
  end
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

توضیح:

  • to_csv: این روش یک رشته CSV در حافظه ایجاد می کند. این برای مجموعه داده های کوچکتر مفید است اما به دلیل محدودیت حافظه می تواند برای مجموعه داده های بزرگ مشکل ساز باشد.
  • stream_csv_to: این روش داده های CSV را مستقیماً به یک جریان خروجی منتقل می کند (به عنوان مثال ، یک پاسخ HTTP). ابتدا هدرهای CSV را می نویسد ، سپس بیش از هر رکورد در دسته ها تکرار می شود و هر ردیف را به جریان می نویسد.
  • CSV_HEADERS: این روش هدر CSV را که نام ویژگی های قابل خواندن انسان هستند ، برمی گرداند.
  • CSV_ROW: این روش با نقشه برداری از csv_attributes به مقادیر مربوطه در پست ، یک ردیف CSV برای یک پست معین ایجاد می کند.
  • csv_attributes: این روش ویژگی هایی را که باید در CSV گنجانده شود ، تعریف می کند. در این حالت ، ما شامل شناسه ، عنوان ، محتوا ، نویسنده ، create_at و به روز شده_AT هستیم.

کنترل کننده

در مرحله بعد ، بیایید به کنترلر ، که درخواست و پاسخ HTTP را بر عهده دارد ، نگاهی بیندازیم:

class PostsController < ApplicationController
  def index
    @posts = Post.all

    respond_to do |format|
      format.html do
        # Render the HTML view (e.g., a list of posts)
        render :index
      end
      format.csv do
        set_csv_headers
        stream_csv
      end
    end
  end

  private

  # Sets the necessary HTTP headers for the CSV response
  def set_csv_headers
    response.headers["Content-Type"] = "text/csv"
    response.headers["Content-Disposition"] = "attachment; filename=posts-#{Date.today}.csv"
    response.headers["Cache-Control"] = "no-cache"
    response.headers["Last-Modified"] = Time.now.httpdate
  end

  # Streams the CSV data to the response
  def stream_csv
    Post.stream_csv_to(response.stream)
  ensure
    response.stream.close
  end
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • فهرست: این عمل هر دو قالب HTML و CSV را کنترل می کند. برای HTML ، نمای استاندارد را ارائه می دهد (به عنوان مثال ، لیستی از پست ها). برای CSV ، هدرها را تنظیم کرده و داده های CSV را پخش می کند.
  • set_csv_headers: این روش هدرهای HTTP لازم را برای پاسخ CSV تعیین می کند:
  • نوع محتوا: مشخص می کند که پاسخ یک فایل CSV است.
  • محتوای محتوا: نشان می دهد که پرونده باید با یک نام خاص بارگیری شود.
  • کنترل حافظه نهان: اطمینان حاصل می کند که پاسخ ذخیره نشده است.
  • تدوین شده: آخرین تاریخ اصلاح شده را به زمان فعلی تنظیم می کند.
  • stream_csv: این روش داده های CSV را به پاسخ منتقل می کند. از روش POST از روش stream_csv_to استفاده می کند و از پاسخ به عنوان جریان خروجی عبور می کند. بلوک اطمینان تضمین می کند که جریان پس از نوشتن داده ها بسته شود.

پیکربندی nginx

برای پشتیبانی از جریان ، ممکن است نیاز به پیکربندی سرور Nginx خود داشته باشید. در اینجا یک پیکربندی مثال وجود دارد:

location / {
    proxy_pass http://puma;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_redirect off;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • proxy_pass: درخواست ها را به سرور برنامه PUMA ارسال کنید.
  • proxy_http_version 1.1: تضمین می کند که از HTTP/1.1 استفاده می شود ، که برای جریان لازم است.
  • proxy_set_header: هدرهای مختلفی را تنظیم می کند تا اطمینان حاصل شود که درخواست به درستی ارسال شده است و آدرس IP مشتری به درستی منتقل می شود.
  • proxy_redirect خاموش: کارگردانی تغییر مسیر را غیرفعال می کند ، که به طور کلی برای جریان لازم نیست.

چگونه کار می کند

  1. هنگامی که کاربر درخواست صادرات CSV (به عنوان مثال ، با مراجعه به /posts.csv) را درخواست می کند ، عملکرد شاخص در postscontroller انجام می شود.
  2. روش set_csv_headers هدرهای مناسب را برای پاسخ CSV تعیین می کند.
  3. روش stream_csv post.stream_csv_to (پاسخ. stream) را فراخوانی می کند ، که داده های CSV را مستقیماً به مشتری منتقل می کند.
  4. Nginx تضمین می کند که اتصال جریان به درستی اداره می شود و به برنامه ریل ارسال می شود.

مزایای بارگیری CSV

  • کارایی حافظه: جریان از بارگیری کل مجموعه داده ها به حافظه جلوگیری می کند و آن را برای مجموعه داده های بزرگ ایده آل می کند.
  • زمان پاسخ سریعتر: مشتری بلافاصله دریافت داده ها را شروع می کند و تجربه کاربر را بهبود می بخشد.
  • مقیاس پذیری: این رویکرد برای برنامه های دارای مجموعه داده های بزرگ یا ترافیک زیاد به خوبی مقیاس می یابد.

پایان

پخش مجدد CSV در ریل ها یک تکنیک قدرتمند برای کارآمد با مجموعه داده های بزرگ است. با استفاده از مدل پست به عنوان نمونه ، ما نحوه اجرای این ویژگی را در یک برنامه ریل نشان داده ایم. این روش می تواند با سایر مدل ها و سناریوهای صادرات داده ها سازگار باشد و آن را به ابزاری همه کاره برای ابزار توسعه ریل های شما تبدیل کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا