video = Video.find(79)video.url.sub! "http", "https"video.save 看看我的服务器控制台,当我发出这个请求时,我看到了这个: Video Load (48.7ms) SELECT `videos`.* FROM `videos` WHERE `videos`.`id` = 79 LIMIT 1(43.3ms) BEG
video = Video.find(79) video.url.sub! "http", "https" video.save
看看我的服务器控制台,当我发出这个请求时,我看到了这个:
Video Load (48.7ms) SELECT `videos`.* FROM `videos` WHERE `videos`.`id` = 79 LIMIT 1 (43.3ms) BEGIN (46.4ms) COMMIT
注意,即使子命令成功找到匹配并进行替换,也不会进行UPDATE调用.
但是,做:
video.url = "https://example.com" video.save
我知道了:
(40.6ms) BEGIN SQL (41.8ms) UPDATE `videos` SET `url` = "https://example.com", `updated_at` = '2014-03-18 14:52:22' WHERE `videos`.`id` = 79 (57.8ms) COMMIT
我一直在与这个无休止的斗争.有谁知道发生了什么?
因为您使用sub!就地修改了字符串,所以Active Record为您生成的url =方法永远不会被调用,所以它不知道您已经修改过它.您可以使用video.url = video.url.sub …方法,也可以使用attribute_will_change!该特定属性的方法:
video = Video.find(79) video.url_will_change! video.url.sub! "http", "https" video.save