Ors*_*say 1 database ruby-on-rails ruby-on-rails-4
我想创建一个新对象(如果不存在)。或仅更新其电子邮件(如果它已经存在于我的数据库中)。我从CSV文件导入数据。
我尝试使用find_or_create_bymethod,但是当对象已经存在时仍会在数据库中复制该对象。它不只是更新它。
人.rb
class Person < ActiveRecord::Base
validates :email, uniqueness: true
require 'csv'
def self.import_data
filename = File.join Rails.root, '/vendor/people.csv'
CSV.foreach(filename, headers: true, col_sep: ',') do |row|
firstname, lastname, home_phone_number, mobile_phone_number, email, address = row
Person.find_or_create_by(firstname: row['firstname'], lastname: row['lastname'], home_phone_number: row['home_phone_number'], mobile_phone_number: row['mobile_phone_number'], email: row['email'], address: row['address'])
end
end
end
Run Code Online (Sandbox Code Playgroud)
schema.rb
create_table "people", force: :cascade do |t|
t.string "email"
t.string "home_phone_number"
t.string "mobile_phone_number"
t.string "firstname"
t.string "lastname"
t.string "address"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
Run Code Online (Sandbox Code Playgroud)
这是解决方案:
person = Person.find_or_create_by(firstname: row["firstname"])
person.update_attributes({firstname: row['firstname'], lastname: row['lastname'], home_phone_number: row['home_phone_number'], mobile_phone_number: row['mobile_phone_number'], address: row['address'], email: row['email']})
Run Code Online (Sandbox Code Playgroud)
我无法解释为什么这种解决方案有效,而不是您向我提出的解决方案。但是,感谢@sohail_khalil和@abhilash的帮助!