簡體   English   中英

Rails-如何使用新創建的對象更新數據庫中的現有記錄

[英]Rails - how to update existing record in database with a newly created object

我正在從CSV文件中獲取數據並將其保存到數據庫中。 這是簡化的代碼結構(這是一個小任務):

... loading CSV tools...
car = Car.new
car.tender_load_id = data.element[8]
car.brand = data.element[2]
car.color = 'green'
...
car.build_car_metadata(mbol: help_var[:mbol], ...)
car.first_registration = data.element[21]

car.skip_registration_code_validation = true # for not creating registration_code

if existing_car = Car.where("cars.tender_load_id ILIKE ?", "%#{car.tender_load_id}%").first
  # car already exists => update
  existing_car.update(car)
  puts "Car exists, updating car with ID #{existing_car.id}."
else
  car.save!            
end

當我運行此任務時,會出現以下錯誤消息:

NoMethodError: undefined method `reject' for #<Car:0x007fa3e2063a78>

它指出了這一行:

existing_car.update(car)

我該如何工作? 不幸的是,我不能將if-else部分放在rake任務的開始,結構必須是這樣的。

先感謝您。

您只需要使用屬性更新現有汽車,就不能傳遞完整模型。

建立屬性,然后根據汽車是否已經存在來創建或更新:

attributes = {}
attributes[:color] = ...
attributes[:brand] = ...
attributes[:tender_load_id] = ...


if (car = Car.where("cars.tender_load_id ILIKE ?", "%#{attributes[:tender_load_id]}%").first)
  car.update(attributes)
else
  Car.create!(attributes)
end

注意1:似乎可以有多輛具有相同的tender_load_id汽車。 這意味着對現有汽車的查詢將返回任意記錄。 也許您想向該查詢添加order

注意2:查詢方式似乎很脆弱。 CSV中沒有更好的ID嗎?

注3:以_id結尾的屬性通常是外鍵。 因此,也許為此屬性找到一個更好的名稱。

暫無
暫無

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

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