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
服务器详细信息