ruby-on-rails - 添加列的自定义默认值
问题描述
我正在创建一个迁移,在其中向模型添加一列。由于模型中已经有对象,我想给它们一个默认值。但是不同对象的含义会根据链接模型中另一个对象的状态而有所不同。
class Message < ApplicationRecord
belongs_to :user
end
class User < ApplicationRecord
has_many :messages
end
class AddColumnMessageSendType < ActiveRecord::Migration[5.1]
def change
add_column :mesasges, :send_type, :string, default: ???
end
end
可以在新迁移each do
之后 使用或在新迁移中添加def change
并执行。但我想知道你是否可以使用这个。谢谢update(send_type: custom_value)
if
default:
解决方案
我会创建一个回调来处理这个新记录,并为已经存在的记录合并一个 rake 任务。
应用程序/模型/message.rb:
class Message < ApplicationRecord
belongs_to :user
before_create :set_send_type
def set_send_type
if something
send_type = 'a'
else
send_type = 'b'
end
end
end
每次创建新消息时都会运行上述内容。这里有很多关于回调的内容。
然后在 rake 任务(lib/tasks/set_send_types.rake)中:
rake set_send_types: :environment do
Message.all.each do |message|
message.set_send_type
message.save
end
end
您需要message.save
在 rake 任务中调用 ,因为set_send_type
此示例中的实际并未保存到数据库本身。它依赖于运行回调后发生的保存。
您应该只需要运行一次 rake 任务。
推荐阅读
- python - mplfinance 中是否有等效的 plt.scatter ?如何在 mplfinance 中绘制数据点?
- javascript - 是否可以从不同 html 的 javascript 函数创建和打开新的 html?
- triggers - Azure Datafactory - 翻滚窗口触发器
- python - 是否有支持动态传递的 python socket.io 库?
- c# - Stream.Read() 性能缓慢
- javascript - 有没有办法进入一个javascript文件来提取文件的某些区域?
- swift - 滚动视图下的 SwiftUI 点击
- swiftui - 尝试在 SwiftUi 中学习 @EnvironmentObject
- scala - 使用 concat() 时如何为字符串添加括号
- mongodb - pymongo 查询未在烧瓶 api 中返回任何内容