2017-11-10 2 views
0

アクティブなレコードオブジェクトをコピーした後、新しいオブジェクトassociation.sizeは実際にデータベースに存在する数を2倍返します。私はそのサイズがキャッシュされたバージョンをロードしようとしているのを見ていて、実際にはクエリを実行していますが、その量を表示するためにSQLクエリを常に実行したくありません。 私の(関連)のコードは次のようになります。Ruby on Rails関連するActiveRecordのサイズは、モデルの複製後に2倍の数値を返します。

class Model1 < ActiveRecord::Base 
def copy_model 
new_model = self.dup 
new_model.name = "Copy of #{name}" 
new_model.association = association.map{|a| a.dup} 
new_model.save 
new_model 
end 

new_model.association上でこの呼び出し.sizeは二回.count

+0

いいえ、間違った場所で行う必要があります。カウントとサイズは、どちらも同じ出力を与えます。また、上記のコードでは、関連を複製する際に構文エラーが発生します。 それ以外の場合、上記のコードはモデルをコピーするために完全に機能します。 –

+0

try 'new_model.association.reload.count' – MrYoshiji

+0

@MrYoshiji' count'はクエリであり、正確な結果を返します。 'array'がすでにロードされている場合、' size'はアソシエーション "Array"に対するメソッド呼び出しです。まだ存在していないオブジェクトが含まれていると、 'size'はcountと異なることがあります。 'reload'の有無にかかわらず' count'は同じ結果を返します。 – engineersmnky

答えて

0

ので、Aakash Gupta氏とのSzymonは私がどこかに私は私の関連クラスは、この行があることが判明何か間違ったことやっていると述べた後:

belongs_to :model, counter_cache: :association_count 

サイズのオペレータは、より効率的にし、スキップすることがありデータベースquerys。しかし、オブジェクトを複製した後、私のキャッシュは壊れていました。だから、呼び出し:ここで説明するよう

Model.reset_counters(new_model.id, :association) 

https://apidock.com/rails/ActiveRecord/CounterCache/reset_counters は私の問題を修正しました。

0

の量を返した後、私はそれをチェックしていると、上のコードでは何も問題はありません4.のようにRSpecのを書くようにしてくださいレール:関連するモデルは、リモートストレージに言及Imageときさらに、

copied_model = ... 
expect(copied_model.reload.association.size).to eq 3 

、それが問題である可能性があります。しかし、それ以上の文脈がなければ、associationが何であるか、ここで問題を見つけるのは難しいです。

​​が予約語であり、カスタムコレクション名として使用できないことがわかっているとします。

+0

アソシエーションは単なるアクティブなレコードクラスです。しかし、私はそれがこの行を持っていることに気づきました: 'belongs_to:model、counter_cache :: associ_count' ドキュメントに従って、メソッドサイズをより効率的にする。しかし、私の場合はキャッシュを混乱させるかもしれませんね。 –

+0

申し訳ありません編集:私はいくつかのグーグルを行い、これを見つけました:https://apidock.com/rails/ActiveRecord/CounterCache/reset_counters カウンタをリセットして私の問題を解決しました。わーい!他の場所を見せてくれてありがとう。 –

+0

@Jaschaあなたは大歓迎です。 – Szymon

0

マップを作成しないでください。以下を試してください:

association.each do |a| 
    new_model.association << a.dup 
end 
関連する問題