У меня есть эта функция для загрузки несколько .csv
файлов в массив объектов:Как получить атрибуты класса и сопоставить их с заголовками .csv общим способом?
def load_csv_data_to_order_objects
orders = []
get_data_paths("../my/path", ".csv").each do |path|
CSV.foreach(path, :headers => :first_row, :col_sep => ',', encoding: "ISO8859-1:utf-8") do |row|
orders.push Order.new(
:date => row["ORDER_DATE"],
:seller_id => row["SELLER_ID"],
:order_number => row["ORDER_NUMBER"],
:product_id => row["PRODUCT_ID"],
:quantity => row["QUANTITY"].to_i,
:sales_price => row["SALES_PRICE"].to_f,
)
end
end
orders
end
Это работает, но мне нужно, чтобы загрузить .csv
файлов с различным числом столбцов в различные типы объектов. Общая «форма» функции одна и та же, но атрибуты объекта различаются.
Чтобы свести к минимуму дублирование кода, как я могу создать более общую версию этой функции?
Я представляю себе что-то вроде этого:
def load_csv_data_to_objects(search_path, file_extension, class_name)
objects = []
get_data_paths(search_path, file_extension).each do |path|
CSV.foreach(path, :headers => :first_row, :col_sep => ',', encoding: "ISO8859-1:utf-8") do |row|
objects.push class_name.new(
# How can I get a class's attributes and map them to .csv headers?
)
end
end
objects
end