簡體   English   中英

在 Rails 中將 2 個表導出為 CSV [如何選擇特定列?]

[英]Exporting 2 tables to CSV in Rails [how to select specific columns?]

我一直在嘗試在 Rails 中將數據庫導出為 CSV。 經過多次試驗和錯誤,我終於讓它工作了,現在我的 CSV 包含完整的 2 個表。

但是,我似乎無法從每個表中僅提取某些列 - 小時日志名稱、小時日志描述、小時日志小時數、小時日志 created_at 和項目名稱(在所附照片中以紅色標記)。

我在網上找到的所有解決方案都是為了提取整個表格。

這是我的模型(對於小時日志):

class Hourlog < ApplicationRecord

    belongs_to :user
    belongs_to :project
    accepts_nested_attributes_for :project
    validates :name, presence: true
    validates :description, presence: true
    validates :hours, presence: true
    validates :date, presence: true
    validates :project, presence: true

      def self.to_csv
        CSV.generate do |csv|
          csv << column_names
          all.each do |hourlog|
            csv << (hourlog.attributes.values_at(*column_names) + hourlog.project.attributes.values )
          end
        end
      end
end

這是我的控制器(用於小時日志):

def index 
    @user = User.all
    @filter = Filter.first
    @project = Project.all
    [... a bunch of code that defines @hourlogs...] 

    respond_to do |format|
      format.html
      format.csv { render text: @hourlogs.to_csv }
    end
end 

這是視圖:

<%= link_to "CSV", hourlogs_path(format: "csv") %>

這是小時日志的架構:

create_table "hourlogs", force: :cascade do |t|
    t.string   "name"
    t.string   "project"
    t.text     "description"
    t.integer  "hours"
    t.datetime "created_at",     null: false
    t.datetime "updated_at",     null: false
    t.integer  "user_id"
    t.datetime "date"
    t.integer  "project_id"
    t.datetime "date_from"
    t.datetime "date_to"
    t.string   "project_filter"
    t.index ["project_id"], name: "index_hourlogs_on_project_id", using: :btree
    t.index ["user_id"], name: "index_hourlogs_on_user_id", using: :btree
  end

這是項目的架構:

create_table "projects", force: :cascade do |t|
    t.string   "name"
    t.text     "description"
    t.string   "plan"
    t.integer  "planhours"
    t.integer  "thours"
    t.datetime "created_at",                    null: false
    t.datetime "updated_at",                    null: false
    t.datetime "plandate"
    t.datetime "starthourtrack"
    t.integer  "duration"
    t.text     "notes"
    t.boolean  "status",         default: true
  end

任何幫助將不勝感激,我現在​​已經掙扎了 10 個小時,似乎無法得到它。 我嘗試創建一個單獨的 index.csv.erb 文件,概述標題名稱,選擇 hourlog.name,而不是 hourlog.attributes.values_at(*column_names),但我似乎無法正確理解語法/邏輯。 謝謝!

[編輯:解決方案]看起來我只需要一些括號 - 我添加了特定的列名來限制顯示的列數,然后我寫出我需要的每一列(hourlog.name、hourlog.description 等) - 我沒有沒有意識到我需要把那些放在 [] 中,在“csv <<”之后。

def self.to_csv
        CSV.generate do |csv|
          column_names = %w(Project Name Description Hours Date)
          csv << column_names
          all.each do |hourlog|
            csv << [hourlog.project.name, hourlog.name, hourlog.description, hourlog.hours, hourlog.created_at]
          end
        end
      end

我的 CSV 導出現在的樣子 - 我用紅色標記了我想在我的 CSV 文件中包含的唯一列

看起來我只需要一些括號 - 我添加了特定的列名來限制顯示的列數,然后我寫出我需要的每一列(hourlog.name、hourlog.description 等) - 我沒有意識到我需要把那些放在 [] 中,在“csv <<”之后。

def self.to_csv
        CSV.generate do |csv|
          column_names = %w(Project Name Description Hours Date)
          csv << column_names
          all.each do |hourlog|
            csv << [hourlog.project.name, hourlog.name, hourlog.description, hourlog.hours, hourlog.created_at]
          end
        end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM