3

私は奇妙なことに遭遇しました。ブール値である「読み取り」フィールドを持つモデル GuardianUpdate があります。レコードで update_attribute(:read, true) を呼び出すと、レールは実際にレコードを更新できません。

これが私のコンソール出力です:

1.9.3p0 :026 > g = GuardianUpdate.find(1)
  GuardianUpdate Load (0.7ms)  SELECT `guardian_updates`.* FROM `guardian_updates` WHERE `guardian_updates`.`id` = 1 LIMIT 1
 => #<GuardianUpdate id: 1, update_id: 2, guardian_id: 11, read: true, created_at: "2012-04-21 04:06:45", updated_at: "2012-04-21 04:06:45"> 
1.9.3p0 :027 > g.update_attribute(:read, false)
   (0.3ms)  BEGIN
  Update Load (0.4ms)  SELECT `updates`.* FROM `updates` WHERE `updates`.`id` = 2 LIMIT 1
   (0.1ms)  COMMIT
 => true 
1.9.3p0 :028 > g.reload
  GuardianUpdate Load (0.5ms)  SELECT `guardian_updates`.* FROM `guardian_updates` WHERE `guardian_updates`.`id` = 1 LIMIT 1
 => #<GuardianUpdate id: 1, update_id: 2, guardian_id: 11, read: true, created_at: "2012-04-21 04:06:45", updated_at: "2012-04-21 04:06:45"> 
1.9.3p0 :029 > 

ご覧のとおり、UPDATE sql ステートメントはどこにもありません。ここに私の GuaridanUpdate モデルがあります:

class GuardianUpdate < ActiveRecord::Base
  belongs_to :update
  belongs_to :guardian
end

何かご意見は?

update_column(:read, true) は機能しますが、まったく問題ありません。

4

2 に答える 2

4

は、同じ名前の内部レール メソッドを上書きbelongs_to :updateするアクセサーを作成しています。updateそのメソッドは、既存のオブジェクトへの変更を実際に保存する役割を果たします。

関連付けの名前を変更すれば、問題ありません。Rails はDangerousAttributeNameこれを警告するために例外を発生させると想定されています - なぜこれが起こらないのか分かりません

于 2012-04-25T03:01:36.983 に答える
2

「belongs_to :update」があるので、おそらく Update というモデルがあります。一部の人々は、Update と呼ばれるモデルを使用して問題を報告しています。こちらを参照してください。

https://rails.lighthouseapp.com/projects/8994/tickets/5772-calling-a-model-update-leads-to-unexpected-behavior

名前を ContentUpdate などに変更してみてください。

于 2012-04-25T02:13:32.943 に答える