[英]changing model's id type from integer to decimal makes all entries try to be 0.0 (rails 3.2.1)
我是一名Rails初学者(我认为目前我的基础知识还不错),并且我正在开发一个具有简单父子结构的应用程序:Company => Client => Group => Order。 此问题的相关数据库表是组和订单(组has_many订单)。
现在,当我创建一个新组时,表单上的文本字段之一是“订单数量”(在Group模型中是:size属性),并且在GroupsController的Create操作中有一行代码可以生成属于该特定组的n个空订单:
if @group.save
@group.size.times do
Order.create(:group_id => @group.id)
end
这工作正常,但我希望Order.id为十进制数字而不是整数。 我尝试生成以下迁移:
class ChangeOrderIdToDecimal < ActiveRecord::Migration
def up
change_column :orders, :id, :decimal, :precision => 5, :scale => 4
end
起初,这似乎可以满足我的要求。 现有的所有订单从4、5、6更改为4.0、5.0、6.0。 不过,我最终想要做的是将一些代码添加到GroupsController中的Create操作中,如下所示:
if @group.save
order_id_decimal = 0.001
@group.size.times do
order_id = "#{@group.id}.#{order_id_decimal}".to_f
Order.create(:group_id => @group.id, :id => order_id)
order_id_decimal += 0.001
end
想法是,如果组ID为75,则该组中的订单将具有ID 75.001、75.002、75.003等。
但是由于某种原因,当我创建新组时,它尝试将每个订单ID保存为0.0000,并给我这个错误:
ActiveRecord::RecordNotUnique in GroupsController#create
Mysql2::Error: Duplicate entry '0.0000' for key 'PRIMARY': INSERT INTO `orders`
(`created_at`, `group_id`, `note`, `order_status`, `title`, `updated_at`, ) VALUES
('2012-03-04 20:28:15', 20, NULL, NULL, NULL, '2012-03-04 20:28:15')
我试着从铁轨控制台手动更改订单的ID,并将其保存没有给我的错误,但它实际上并没有保存。 如果我输入Order.find(0.0),它将拉起我刚刚更改的一个订单,并且ID为0.0。 我对此完全感到困惑,并且无法通过谷歌搜索找到任何帮助。 有人有想法么?
对于ID字段仅使用整数类型,您将永远不会遇到这样的问题。 如果您更改了ID类型,则应手动进行管理
您正在尝试将业务逻辑封装在ID字段中。 从应用程序设计的角度来看,这是一个很大的禁忌,而从数据库设计的角度来看,拥有一个不是整数的ID字段是一个很大的禁忌。
我想放弃这种想法,即您希望将ID以某种方式在整个表之间建立关联。 外键和联接表应该能够实现最终目标(相关组和订单)。 主键不是用于业务逻辑的,不应用于此目的:不在乎ID字段的内容,您的应用程序会更快乐。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.