在表中创建或更新对象

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)

Ors*_*say 5

这是解决方案:

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的帮助!