【问题标题】:Rails Migration - Non-Static Default ValueRails 迁移 - 非静态默认值
【发布时间】:2013-05-09 04:09:24
【问题描述】:

我有一个关于在 Rails 迁移中将列的默认值设置为非静态值的问题。

我有一个“用户”表,其中已经包含 id、first_name 和 last_name 列,并且我想添加一个名为“username”的新列,该列默认为用户的姓氏。这是我目前拥有的:

class AddLoginToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string, :default => :last_name
  end
end

显然,这不会产生预期的结果(默认为字符串“last_name”)。如何将默认值设置为行的 last_name 值?

提前致谢。

【问题讨论】:

  • 请记住,迁移只是将 SQL 命令发送到您的数据库平台,因此首先您需要了解您希望这些命令是什么。您可以使用触发器或 SQL Server 的计算列来完成您尝试做的事情,但我强烈建议您完全放弃数据库技巧并在应用程序层处理这个问题,就像在@mind.blank 的答案中一样。

标签: ruby-on-rails database migration default


【解决方案1】:

不确定是否可以这样做,您可以改为在 User 模型中添加 before_validationbefore_save 回调:

class User < ActiveRecord::Base
  before_validation :create_username_if_missing

  private

  def create_username_if_missing
    self.username = last_name unless username
  end
end

并在添加回调后更新所有现有用户:

User.where("username is null").each do |user|
  user.update_attributes(username: user.last_name)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多