find_or_initialize_by不适用于2列

时间:2013-03-12 14:01:02

标签: ruby-on-rails ruby

我正在尝试使用ActiveRecord在我的数据库中插入数据。

当我使用pdays = MyModel.new进行初始化而不是find_or_initialize_by时,脚本运行正常。但它只运行一次。我需要每天运行以执行更新。当我第二次尝试使用pdays = MyModel.new运行脚本时,不会引发重复的键约束。

因此我尝试使用2个参数进行下面的find_or_initialize_by,但这会产生错误:

  

未定义的方法`find_or_initialize_by'

2列一起构成唯一记录:

vertica_traffic.each do |vdays|

  pdays = MyModel.find_or_initialize_by([:local_dt], vdays[:community_id])

  pdays[:local_date]       = vdays_traffic[:local_d]
  pdays[:community_id]     = vdays_traffic[:community_id]
  pdays[:uniquesters]      = vdays_traffic[:uniques]

  pdays.save

end

3 个答案:

答案 0 :(得分:9)

如果您使用的是rails 3.2.1及更高版本,则该方法的新名称为first_or_initialize。它与where一起使用。在您的情况下,由于您正在调用save,因此您应该使用first_or_create,但如果您想手动调用save,只需替换该方法并在

之后调用save。
MyModel.where(local_date: vdays_traffic[:local_date], community_id: vdays_traffic[:community_id]).first_or_create do |record|
  record.uniquesters = vdays_traffic[:uniques]
end

答案 1 :(得分:7)

I read here that in Rails 4,这是正确的语法:

Progress.find_or_initialize_by(chore_id: chore.id, period: period[chore.frequency], account_id: chore.account_id)

答案 2 :(得分:6)

你可以尝试:

MyModel.find_or_initialize_by_local_dt_and_comunity_id([:local_dt], vdays[:community_id])

使用_and_

附加列名称