Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 数据库主键表序列值可以由Rails应用程序管理吗?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 数据库主键表序列值可以由Rails应用程序管理吗?

Ruby on rails 数据库主键表序列值可以由Rails应用程序管理吗?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我想基于业务逻辑设置新记录的主键,不需要数据库工具(如序列号和触发器),也不依赖于现有的表数据(如选择最大值)。初始化变量并递增它或使用业务逻辑处理每个新记录都是可以的,但是如何在应用程序重新启动时保持该值?(如果这是一个令人尴尬的简单操作,请客气。) 编辑:我想我现在可以更好地问这个问题了。假设我说服我的DBA重新定义我的表,以便为UUID添加一列,并且我们进行必要的更改以正确使用主键。这一点并没有得到很好的接受,因为即使数据库表可以更好地定义,但是对于做出如此重大的更改还是有很大的担心。以及

我想基于业务逻辑设置新记录的主键,不需要数据库工具(如序列号和触发器),也不依赖于现有的表数据(如选择最大值)。初始化变量并递增它或使用业务逻辑处理每个新记录都是可以的,但是如何在应用程序重新启动时保持该值?(如果这是一个令人尴尬的简单操作,请客气。)

编辑:我想我现在可以更好地问这个问题了。假设我说服我的DBA重新定义我的表,以便为UUID添加一列,并且我们进行必要的更改以正确使用主键。这一点并没有得到很好的接受,因为即使数据库表可以更好地定义,但是对于做出如此重大的更改还是有很大的担心。以及其他原因。但是假设我们修改表列和数据


现在假设以前用作主键的列值是一个五位数,我们必须保留该值,并将其作为“主键”呈现给用户。当然,索引列,将列中的值作为记录ID显示。他们不必知道它不是主键,他们只需要将其视为识别记录的方法。业务需求表明,该字段的值应该是唯一的、顺序松散的,但可以容忍值之间的差异。对于客户端来说,表单和视图将此值显示为标识符是非常重要的。我想用业务逻辑来管理这个值,同样,独立于表序列和触发器。能做到吗?这看起来很简单,但是我们因为追逐不合逻辑的思路而头晕目眩。

我不是100%确定你想做什么。手动向表中添加主键似乎不是一个好主意

你可以做的三件事是1)从一个高的数字开始索引,比如98765,或者像这样从0开始

class CreateReports < ActiveRecord::Migration[6.1]
def self.up
    create_table :reports do |t|
       ...
    end
    execute("ALTER TABLE reports AUTO_INCREMENT = 98765;")
end
create_table :reports, :id => false do |t|
  t.bigint :id
  ...
end
将UUID设置为默认主键类型

# config/initializers/generators.rb
Rails.application.config.generators do |g|
  g.orm :active_record, primary_key_type: :uuid
end
现在,您的下一次迁移应该如下所示

rails g迁移创建报告

# config/db/migrate/create_post_with_uuid.rb
class CreateReports < ActiveRecord::Migration[6.0]
  def change
    create_table :reports, id: :uuid do |t|
       ...
    end
  end
end
现在您可以自己管理您的ID了。 我会为uniqness设置一个模型约束


我希望这能有所帮助。

我不能百分之百确定您想做什么。手动向表中添加主键似乎不是一个好主意

你可以做的三件事是1)从一个高的数字开始索引,比如98765,或者像这样从0开始

class CreateReports < ActiveRecord::Migration[6.1]
def self.up
    create_table :reports do |t|
       ...
    end
    execute("ALTER TABLE reports AUTO_INCREMENT = 98765;")
end
create_table :reports, :id => false do |t|
  t.bigint :id
  ...
end
将UUID设置为默认主键类型

# config/initializers/generators.rb
Rails.application.config.generators do |g|
  g.orm :active_record, primary_key_type: :uuid
end
现在,您的下一次迁移应该如下所示

rails g迁移创建报告

# config/db/migrate/create_post_with_uuid.rb
class CreateReports < ActiveRecord::Migration[6.0]
  def change
    create_table :reports, id: :uuid do |t|
       ...
    end
  end
end
现在您可以自己管理您的ID了。 我会为uniqness设置一个模型约束


我希望这能有所帮助。

这是一个非常棘手的问题

在关系数据库中,主键并不真正用于在外部识别记录。主键是数据库将表链接在一起的方式

您的主键应该在数据库中生成,并且有完全独立于记录数据的主键。最主要的是简单性、中立性和与业务逻辑的变化脱钩

您的模型实际上可以有任意数量的标识符,这些标识符只是可用于查找记录的唯一列。例如,可敬的鼻涕虫:

/posts/vanity-urls-for-idiots
在这个假设的博客应用程序中,我们通过标题生成的列slug来查找文章:

def show
  @post = Post.find_by!(slug: params[:id])
end
如果您想使用另一个标识符,Rails中除了约定之外没有什么可以阻止您不在外部公开主键。您可能需要在模型中定义
#to_param
方法,以避免无意中暴露它们


您可以很好地在应用程序中生成任意数量的标识符,如果需要,您可以实际使用数据库生成序列,甚至可以完全使用外部标识符,例如来自OAuth提供商的UID。

这在很大程度上是一个X&Y问题

在关系数据库中,主键并不真正用于在外部识别记录。主键是数据库将表链接在一起的方式

您的主键应该在数据库中生成,并且有完全独立于记录数据的主键。最主要的是简单性、中立性和与业务逻辑的变化脱钩

您的模型实际上可以有任意数量的标识符,这些标识符只是可用于查找记录的唯一列。例如,可敬的鼻涕虫:

/posts/vanity-urls-for-idiots
在这个假设的博客应用程序中,我们通过标题生成的列slug来查找文章:

def show
  @post = Post.find_by!(slug: params[:id])
end
如果您想使用另一个标识符,Rails中除了约定之外没有什么可以阻止您不在外部公开主键。您可能需要在模型中定义
#to_param
方法,以避免无意中暴露它们


您可以很好地在应用程序中生成任意数量的标识符,如果需要,您可以实际使用数据库生成序列,甚至可以完全使用外部标识符,例如来自OAuth提供商的UID。

对我的问题的明确回答说服了我的DBA和我自己放弃使用通过应用程序逻辑插入新记录时以编程方式生成主键。感谢您帮助确定是,可以这样做,但不应该这样做。

对我的问题的明确回答说服我的DBA和我自己放弃在通过应用程序逻辑插入新记录时以编程方式生成主键的方法。感谢您帮助确定是的,这可以做到,但不应该做到。

这是一个令人尴尬的复杂操作。如果你有多个线程,你会引入一些潜在的竞争条件。这是什么实际要求