1

レール3.2.8

Logable として単純な多態的な Log モデルを作成しようとしました。このテーブルには log という 1 つのフィールドしかなく、タイムスタンプと短いメッセージが has_one リレーションに追加されると想定されていました。

私の問題は、レコードが作成された後、メッセージを追加して保存できないように見えることです。デバッグすると、コミットされてレコードが変更されたことが示されますが、再ロードすると元のバージョンに戻ります。私はこの方法を長い間見てきましたが、他の誰かが何か愚かなことを見ているかどうかを確認する時が来ました.

モデルの関連部分:

class Log < ActiveRecord::Base
  belongs_to :logable, :polymorphic => true
  attr_accessible :logable_id, :log, :logable_type

  def set_log(entry)
    self.log << "\r\n#{Time.now.to_s} - #{entry}"
    self.save    
  end
end

class Candidate < ActiveRecord::Base
  attr_accessible :citizen_id, :commitment_id, :current_stage, :current_status
  has_one :log, :as => :logable

  def append_log(entry)
    if self.log.nil?
      self.build_log( :log => "#{Time.now.to_s} - Log Created")
      self.log.save
    end
    self.log.set_log(entry)
  end
end

以下は、候補を取得し、ログを見て (元の作成されたエントリのみ)、エントリを追加し、インスタンスで行われた変更を表示するコンソール ログからのものです。ログ レコードをリロードすると、変更が失われます。

1.9.2-p136 :001 > c = Candidate.find(1)
  Candidate Load (15.1ms)  SELECT "candidates".* FROM "candidates" WHERE "candidates"."id" = ? LIMIT 1  [["id", 1]]

1.9.2-p136 :002 > c.log
  Log Load (0.1ms)  SELECT "logs".* FROM "logs" WHERE "logs"."logable_id" = 1 AND "logs"."logable_type" = 'Candidate' LIMIT 1
 => #<Log id: 1, logable_id: 1, logable_type: "Candidate", log: "2012-11-16 15:23:49 -0600 - Log Created", created_at: "2012-11-16 21:23:49", updated_at: "2012-11-16 21:23:49"> 

1.9.2-p136 :003 > c.append_log("Add entry")
LOG BEFORE 2012-11-16 15:23:49 -0600 - Log Created
   (0.1ms)  begin transaction
   (0.1ms)  commit transaction
LOG APPENDED 2012-11-16 15:23:49 -0600 - Log Created
2012-11-16 16:05:53 -0600 - Add entry
NOTE Log field has been appended
 => nil 

1.9.2-p136 :004 > c.log
 => #<Log id: 1, logable_id: 1, logable_type: "Candidate", log: "2012-11-16 15:23:49 -0600 - Log Created\r\n2012-11-16...", created_at: "2012-11-16 21:23:49", updated_at: "2012-11-16 21:23:49">

NOTE Now reload the log record
1.9.2-p136 :005 > l = Log.find(1)
  Log Load (0.3ms)  SELECT "logs".* FROM "logs" WHERE "logs"."id" = ? LIMIT 1  [["id", 1]]
 => #<Log id: 1, logable_id: 1, logable_type: "Candidate", log: "2012-11-16 15:23:49 -0600 - Log Created", created_at: "2012-11-16 21:23:49", updated_at: "2012-11-16 21:23:49"> 
NOTE The add entry line is gone!

これが has_one リレーションの問題かどうかはわかりませんが、ログ レコードだけで set_log を呼び出しても、at が追加されているように見えますが、リロードしても変更はありません。

困惑したスティーブ

4

2 に答える 2

2

しようとする

self.save!

エラーがある場合はエラーが発生するはずです

独自の例外を発生させたり、次のような魔法を行うこともできます

if !self.save
  raise "attempt to save failed"
end
于 2012-11-16T22:36:53.177 に答える
1

Railsのログをすべて表示していますか?お電話いただいた後、 SQL ログ エントリがc.append_log表示されると思いますが、ありません。これは、 inが失敗しUPDATEていることを示唆しています。onを吐き出して、検証が失敗しているかどうかを確認してください...self.saveset_log.errorsc.log

<<ダーティ属性ビットをいじらないためです。

に変更<<する+=とうまくいくはずです。

self.log += "\r\n#{Time.now.to_s} - #{entry}"

于 2012-11-16T22:34:18.007 に答える