Rails CSV 导入 - 关联参数

Rails CSV import - association params

我正在尝试弄清楚如何导入 CSV 文件以创建新记录并建立适当的关联。

我有 3 个模型:
1)农民(has_many:农场)
2)农场(has_many:作物,belongs_to:农民)
3) 作物 (belongs_to :农场)

目标是让用户手动创建每个农场,然后通过 CSV 文件导入作物。我不知道如何将 farm_id 传递给正在上传的作物,从而创建关联。

Crops 控制器上的导入操作:

def import
  Crop.import(params[:file], params[:farm_id])
  redirect_to root_url, notice: "Crops imported."
end

Crop模型中的导入方式:

    def self.import(file, farm)
      CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
        row["farm_id"] = farm
        Crop.create! row.to_hash
      end
    end

在农场上传的表格#show 页面:

#@farm = Farm.find(params[:id])
<%= form_tag import_crops_path, multipart: true do %>
<%= file_field_tag :file %>
<%= submit_tag "import CSV" %>

如何将农场#show 页面上的@farm.id 与文件一起发送到导入#crops?
最好是通过表单还是其他方式来完成此操作方式?

您可以通过多种方式执行此操作,这取决于您的路由设置方式。

如果你有类似的东西

resources :farms do
  resources :crops
end

import_crops_path(@farm, @crop) 将按照 /farms/:farm_id/crops/new

生成 url

通过这两个选项,您可以通过参数[:farm_id]

获取农场 ID

另一种选择是使用隐藏字段。

f.hidden_field(:farm, :id)

这将创建一个 html 字段

<input type="hidden" id="farm_id" name"farm[id]" value="#{@farm.id}" />

通过这两个选项,您可以通过参数[:farm_id]

获取农场 ID

参考资料

https://apidock.com/rails/ActionView/Helpers/FormHelper/hidden_field http://guides.rubyonrails.org/routing.html