我正确使用find_or_create_by方法吗?

时间:2014-03-20 04:07:04

标签: ruby-on-rails postgresql database-design

我正在尝试从现有数据库填充新表,但我的方法似乎没有正常工作。以下是我的代码。

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就足够了吗?我不知道是否需要为我的数据库提供更多信息,但如果需要,我将提供更多详细信息。

1 个答案:

答案 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