Rails动态默认列值

时间:2014-11-28 08:45:57

标签: mysql ruby-on-rails ruby ruby-on-rails-4

tl; dr:动态定义模型属性/数据库列默认的Rails-y方式是什么?


我的Rails应用中有一个基于Devise的用户模型,其自定义列organization_group_id的默认值为2

vim db/schema.rb

揭示了:

  # ...
  create_table "users", force: true do |t|
    # ...
    t.integer  "organization_group_id",  default: 2
    # ...
  end
  # ...

a 默认值是在创建时分配的,但它不正确。错误的默认值(id 1)曾是正确的默认值,但我更改了OrganizationGroup模型中的数据,id 2变为正确。上面生成的模式文件是正确生成的。

u = User.new
#<User id: nil, ... organization_group_id: 1,...>

现在,我可以看到为什么会发生 - 在MYSQL中,默认是不正确的,可能是从默认设置为不同的方式(在一分钟内更多)的剩余部分。

DESCRIBE users;
+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| id                     | int(11)      | NO   | PRI | NULL    | auto_increment |
| ...                    | ...          | ..   | ... | ...     |                |
| organization_group_id  | int(11)      | YES  | MUL | 1       |                |
| ...                    | ...          | ..   | ... | ...     |                |
+------------------------+--------------+------+-----+---------+----------------+

但我的问题是:为什么我的最后rake db:migrate工作在这个实例中没有覆盖数据库默认值?我猜测答案与之有关:我的迁移会动态加载默认ID吗?如果是这样,是否有一种首选的Rails-y方式来处理动态默认值?或者我可能会重新加载我的数据库,以便Rails重新运行列更改 - 如果有的话,有没有办法在不吹走生产数据的情况下执行此操作?

vim db/migrate/20141125153344_add_default_value_to_user_organization_group.rb

揭示了:

class AddDefaultValueToUserOrganizationGroup < ActiveRecord::Migration
  def change
    if OrganizationGroup && !OrganizationGroup.where(group_name: "n/a").first.nil?
      change_column :users, :organization_group_id, :integer, :default => OrganizationGroup.where(group_name: "n/a").first.id
    else
      og = OrganizationGroup.new(group_name: "n/a")
      og.save!
      change_column :users, :organization_group_id, :integer, :default => og.id
    end
  end
end

服务器详细信息

  • MYSQL服务器版本:5.1.73
  • ruby​​ 2.0.0p353(2013-11-22修订版43784)[i686-linux]
  • Rails 4.1.4
  • CentOS 6.5版(最终版)

0 个答案:

没有答案