12

ActiveRecordを使用してデータベースにデータを挿入しようとしています。

pdays = MyModel.new以下ではなく初期化に使用するfind_or_initialize_byと、スクリプトは正常に実行されます。ただし、実行されるのは1回だけです。更新を実行するためにこれを毎日実行する必要があります。を使用してスクリプトを2回実行しようとすると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
4

3 に答える 3

9

レール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
于 2013-03-12T14:35:27.613 に答える
9

Rails 4では、これが正しい構文であることをここで読みました。

Progress.find_or_initialize_by(chore_id: chore.id, period: period[chore.frequency], account_id: chore.account_id)
于 2014-11-19T23:08:34.417 に答える
7

あなたは試すことができます:

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

列名をで追加する_and_

于 2013-03-12T14:08:12.077 に答える