0

Railsメソッドの実行順序について質問があります:ここで私は自分のモデルで何をしますか:

def update_fields
  FillMethods.fill_info("BadgeUser", "Badge", self.id, self.badge_id, "badge_")
  self.reload
  self.update_attributes(:completed => true) if self.badge_goal == 0
end

オブジェクトがあり、そのオブジェクトに FillMethods 情報を適用して、このオブジェクトのいくつかのフィールドを埋めて保存します。次に、 Badge_goal == 0 であるかどうかを確認して、完了としてマークします。

私が抱えている問題は、self.reload を配置しないと、self 項目が更新されず、オブジェクトはデータベースに存在しますが、self 項目は FillMethods の前と同じになるということです。self.reload を実行すると、self アイテムは正しく、正しく完了したとマークできます

私の質問は、Ruby が FIllMethods が実行されて自己をリロードするのを待つか、FillMethods が完了する前に自己をリロードするかということです。

self.reload を実行しないと、self 項目が正しくないのはなぜですか? FillMethods は、私の lib ディレクトリにあるモジュールです。

ご協力いただきありがとうございます、

それは私の塗りつぶし方法です:

モジュール FillMethods

def self.fill_info(model1, model2, id1, id2, string)
  parameters1 = model1.constantize.attr_accessible[:default].to_a.map {|s| s.dup}
  parameters1.delete_if {|s| !s.start_with?(string)}
  parameters2 = parameters1.map {|s| s = s.split(string)[1]}

  h = Hash[parameters1.zip parameters2]
  object1 = model1.constantize.find(id1)
  object2 = model2.constantize.find(id2)

  h.each do |parameter1, parameter2|
    object1.update_attribute(parameter1.to_sym , object2.send(parameter2))
  end
    return object1
end

終わり

このメソッドの目的は、BadgeUser テーブルにすべてのバッジ情報を入力することです。Badge テーブル (名前など) の各列について、BadgeUser テーブル Badge_name にある

ありがとう、

4

1 に答える 1

1

コードを見ないとわかりませんが、渡されたパラメーターから判断すると、FillMethods.fill_info は 3 番目のパラメーター id を使用して、db からレコードを再度取得していると思います。次に、レコードを変更して元に戻します。

あなたのオブジェクト(自己)は、ActiveRecordなどの下で、データベースがどこかで変更されたことを知る方法がありません。

db から同じレコードを 1 回ではなく 3 回取得していることに注意してください。

FillMethods.fill_info を代わりにレコード (self 自体) を受け入れるように変更し、それを変更すると、self は新しい状態になります。

補遺

新しいスレッドを明示的に開始しない限り、Ruby コードは 1 つのスレッドで順次実行されるため、 yes,.fill_infoが実行されてから残りの update_fields.

于 2013-05-03T14:14:48.167 に答える