我正在尝试从现有数据库填充新表,但我的方法似乎没有正常工作。以下是我的代码。
class CreateEmployees < ActiveRecord::Migration
def change
create_table :employees do |t|
t.string :first_name, null: false
t.string :last_name, null: false
t.string :email, null: false
t.timestamps
end
Sale.find_each do |sale|
unless Employee.exists?(sale.employee)
puts "Employee #{sale.employee} created!"
else
puts "Employee #{sale.employee} already existed!"
end
employee_info = sale.employee.split
Employee.find_or_create_by(first_name: employee_info[0], last_name: employee_info[1], email:employee_info[2])
end
end
end
我所拥有的是一个名为sales的主数据库,其中包含一个包含employee的字段。在该字段中,您将找到一个字符串条目:“Mary Higgins higgins@korning.com”。 基本上,销售数据库包含四个不同的员工,但员工列出了很多次。我要做的是创建四个唯一的行。我认为上面的代码可以工作,但似乎与我的逻辑有关。当我运行上面的代码时,遍历n行并创建Employee对象,因此,基本上,除非语句由于某种原因从未导致为真。问题可能在于.find_each方法。一个.each就足够了吗?我不知道是否需要为我的数据库提供更多信息,但如果需要,我将提供更多详细信息。
答案 0 :(得分:0)
sale.employee是一个字符串,例如“Mary Higgins higgins@korning.com”
存在?排除条件如Employee.exists?(:email =&gt;“higgins@korning.com”)。如果你像你一样传递一个字符串,首先,它将字符串转换为一个整数然后尝试查找具有该id的记录,在你的情况下它将为0,因此它总是返回false。
我会像这样更改find_each循环:
Sale.find_each do |sale|
employee_info = sale.employee.split
employee = Employee.find_or_create_by(first_name: employee_info[0], last_name: employee_info[1], email:employee_info[2])
if employee.new_record?
puts "Employee #{sale.employee} created!"
else
puts "Employee #{sale.employee} already existed!"
end
end