Ruby on Rails: الطريقة الافتراضية التي تعزفها نموذج Modifiyng بمساعدة <<
-
30-09-2019 - |
سؤال
هناك تصديق على النماذج مع تعليق السمة (من النوع نص)
def Ratification < ActiveRecord::Base
attr_accessor :add_comment
def add_comment=(text)
self.comment ||= ""
self.comment << "\r\n" + text
end
end
وإذا استخدمت add_comment = لا بأس قبل حفظ الكائن. بعد حفظ التغييرات تم إسقاطها.
>> r = Ratification.last
Ratification Load (0.6ms) SELECT * FROM `ratifications` ORDER BY ratifications.id DESC LIMIT 1
=> #<Ratification id: 8, user_id: 686, comment: "dasads", created_at: "2010-06-25 13:16:24", updated_at: "2010-06-25 13:38:36">
>> r.comment
=> "dasads"
>> r.add_comment="text"
=> "text"
>> r.comment
=> "dasads\r\ntext"
>> r.save
SQL (0.7ms) BEGIN
SQL (0.2ms) COMMIT
=> true
>> r.reload
Ratification Load (1.6ms) SELECT * FROM `ratifications` WHERE (`ratifications`.`id` = 8)
=> #<Ratification id: 8, user_id: 686, comment: "dasads", created_at: "2010-06-25 13:16:24", updated_at: "2010-06-25 13:38:36">
>> r.comment
=> "dasads"
لماذا؟!
القضبان 2.3.8 روبي 1.8
المحلول
HRRRM ... هذا غريب ، أرى سلوكًا مشابهًا من تطبيق Rails عندما أحاول القيام به:
@s.name << "test"
ثم إعادة التحميل ... الاسم الأصلي هو الحصول على إعادة تعيين!
ومع ذلك ، إذا قمت بذلك @s.name += "اختبار"
ثم حتى بعد إعادة التحميل ، يتم حفظ الاسم الجديد.
لست متأكدًا من السبب في أن << يتصرف هكذا ، لكنني عادةً ما أتخلف عن += في جميع الحالات ، لذلك لم ألاحظ ذلك من قبل. هل التغيير إلى += يساعدك؟
تحرير: بالنظر إلى واجهة برمجة التطبيقات ، ربما يكون ذلك لأن << يعدل السلسلة الأصلية ، في حين أن + أو + = يصنع سلسلة جديدة ، والتي تحتوي على القديم؟ ربما يحفظ القضبان بطريقة ما الأشياء التي تم تمييزها على أنها جديدة (بدلاً من تعديلها؟)