2016-02-28 58 views
0

我有这个rake任务rake任务更换,而不是创造新的

Event.find_or_create_by(
    time: row[9], 
    date: row[10], 
    event_type: word1, 
    eventimage: row[4], 
    eventname: eventname, 
    eventvenuename: location, 
    event: eventname, 
    eventlink1: eventlink1, 
    eventlink2: eventlink2 
) 

现在正在发生的事情是eventlink1可以被输入在第一时间和第一时间eventlink2null。如果我再次运行它并且eventlink2现在有数据要填充,它将创建一个新行,而不是更新现有数据。

我如何使这个更新现有的行,而不是创建一个新的?

回答

0

find_or_create_by创建一个新行,如果它找不到与您给它的字段匹配的行,并且当您给出nil值时,它会将其转换为SQL WHERE eventlink2 IS NULL,因此第二次找不到确切的比赛。

您应该将该命令分为单独的find_by查询和create命令。

如果你想匹配在数据库中NULL值字段可以包括nil查询:

event = Event.find_by(
    ... 
    eventlink2: [eventlink2, nil] 
) 

if event 
    event.update(...) 
else 
    Event.create(...) 
end 
+0

这难道不是还在做一样的?我不会看像findandupdate或创建? –

+0

编号'find_or_create_by'只是它们的参数相同的'find_by'和'create'的替代品。你需要用不同的参数调用'find_by'。 – Leventix

+0

哦,我忘了'更新'。你需要把它放到'if'的'else'分支中。 – Leventix