gpt4 book ai didi

ruby-on-rails - 下一个可用的记录 ID

转载 作者:行者123 更新时间:2023-12-03 15:06:10 25 4
gpt4 key购买 nike

@user = User.new 
@user.id返回 nil 但我需要在保存之前知道它。是否可以 ?

最佳答案

是的你可以!

我有同样的问题并调查了文档。
解决这个问题的能力实际上与您的数据库类型非常相关。

甲骨文 PostgreSQL 确实有有用的功能可以轻松解决这个问题。
对于 MySQL(oracle) 或 SkySQL (开源)它似乎更复杂(但仍然可能)。如果您需要高级数据库工具,我建议您避免使用这些(MySQL/SkySQL)数据库。

首先你必须在您的应用程序设计中尽量避免这种情况 ,因为在 ID 被保存之前玩弄它们是很危险的。

可能存在您别无选择的情况:
例如,当两个表正在引用它们自己时,出于安全原因,您不允许对这些表进行 DELETE 或 UPDATE。

在这种情况下,您可以使用(PostgreSQL、Oracle)数据库 nextval 函数来生成下一个 ID 号而不实际插入新记录。

一起使用find_by_sql 轨法。

例如,要使用 postgreSQL 和 Rails 执行此操作,请选择一个 Rails 模型并添加一个类方法(而不是实例方法!)。
这可以通过方法名称开头的“ self ”字样来实现。
自我 告诉 Ruby 这个方法只能被类使用,不能被它的实例变量(用'new'创建的对象)使用。

我的 Rails 模型:

class MyToy < ActiveRecord::Base

...

def self.my_next_id_sequence
self.find_by_sql "SELECT nextval('my_toys_id_seq') AS my_next_id"
end
end

当您生成带有 Rails 迁移的表时,默认情况下,Rails 会自动创建一个名为 的列。 id 并将其设置为 主键表 .为确保您不会收到任何“重复主键错误”,Rails 会自动创建 序列 在数据库内部并将其应用到 id 柱子。对于您在表中插入的每条新记录(行),数据库将自行计算新记录的下一个 ID。

Rails 使用 自动命名这个序列表名附加“_id_seq” .
here 所述,PostgreSQL nextval 函数必须应用于此序列.

现在关于 find_by_sql ,如解释 here ,它将创建 一个数组 包含新对象实例 你的类(class)。这些对象中的每一个都将包含 SQL 语句生成的所有列。这些列将以属性的形式出现在每个新对象实例中。 即使这些属性在您的类模型中不存在 !

正如您明智地意识到的那样,我们的 nextval 函数只会返回一个值。
所以 find_by_sql 将创建 一个数组 包含 具有单个属性的单个对象实例 .
为了便于读取该属性的值,我们将使用“my_next_id”命名生成的 SQL 列,因此我们的属性将具有相同的名称。

就是这样了。我们可以使用我们的新方法:
my_resulting_array = MyToy.my_next_id_sequence
my_toy_object = my_resulting_array[0]
my_next_id_value = my_toy_object.my_next_id

并用它来解决我们的死锁情况:
my_dog = DogModel.create(:name => 'Dogy', :toy_id => my_next_id_value)

a_dog_toy = MyToy.new(:my_dog_id => my_dog.id)
a_dog_toy.id = my_next_id_value
a_dog_toy.save

请注意 如果您不使用 my_next_id_value,则此 ID 号将永远丢失。 (我的意思是,将来任何记录都不会使用它)。

数据库不会等待您使用它。如果在任何时候,您的应用程序需要在 my_table_example 中插入一条新记录(可能在我们使用 my_next_id_sequence 的同时),数据库将始终在您生成的记录之后立即为该新记录分配一个 ID 编号my_next_id_sequence,考虑到你的 my_next_id_value 是保留的。
这可能会导致 my_table_example 中的记录似乎没有按创建时间排序的情况。

关于ruby-on-rails - 下一个可用的记录 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5456621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com