上下文
想更改对象的属性,update,save等方法却不生效。以下在命令行操作:
> id = 6
> v = Video.find(id)
=> #<Video id: 6, title: "宝藏", key: nil>
> v.update(title: "随便打的标题")
(0.2ms) BEGIN
(0.2ms) ROLLBACK
=> false #这里应该就看出问题了
> v
=> #<Video id: 6, title: "随便打的标题", key: nil>
> v.reload
=> #<Video id: 6, title: "宝藏", key: nil>
解决方法
其实update和save方法会返回是否成功将对象保存到数据库,当返回false时,可以使用your_model.errors
将错误打印出来。
=> #<ActiveModel::Errors:0x007fff34fab460 @base=#<Video id: 6, title: "宝藏", key: nil>, @messages={:key=>["can't be blank"]}>
原来我在video模型创建后加了一条NOT NULL约束,导致这个之前创建的video对象现在无法在key为nil的情况下保存。
class Video < ActiveRecord::Base
validates :key, presence: true
end
也就是说我需要进行以下操作才能保存:
> id = 6
> v = Video.find(id)
=> #<Video id: 6, title: "宝藏", key: nil>
> v.update(title: "随便打的标题", key: "sdfsdsds") #记得更新不能为nil的key属性
(0.2ms) BEGIN
SQL (0.5ms) UPDATE "videos" SET "key" = $2, "updated_at" = $3 WHERE "videos"."id" = $4 [["qiniu_key", "sdfsdsds"], ["updated_at", "2017-03-15 09:45:35.615265"], ["id", 6]]
(4.6ms) COMMIT
=> true # 返回true代表将对象保存到数据库