繁体   English   中英

将模型的id类型从整数更改为十进制会使所有条目都尝试为0.0(rails 3.2.1)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM