在播种数据时查找 id

jya*_*nks 3 ruby-on-rails

基本上,我想要做的是用一堆初始数据为我的网络应用程序设置我的数据库。例如,有一个产品列表,所有产品都具有一个 product_type。

seeds.rb有以下代码:

ProductType.delete_all
ProductType.create(:name => 'Furniture')

Product.delete_all
Product.create(:name => 'Chair', :type_id => ProductType.first.id, :packaging => '2 for $20', :price_per => 0.1, :default_packaging_number => 2)
Run Code Online (Sandbox Code Playgroud)

现在,我的问题ProductType.first.id是 只是一个占位符。我真正想做的是放一些类似的东西:

:type_id => ProductType.where(:name => "Furniture").id
Run Code Online (Sandbox Code Playgroud)

问题是,当我这样做时,我得到了一个巨大的数字 (70247318042560),这显然不是 id。控制台也返回警告

warning Object#id will be deprecated; use Object#object_id
Run Code Online (Sandbox Code Playgroud)

当我.object_id在 where 语句的末尾使用时,它仍然返回相同的大且不正确的数字。

如何ProductType从数据库中提取家具的 id ?我需要修改权限或其他东西才能访问它吗?

And*_*rew 5

第一的:

当您调用时,ProductType.where()您会得到一个 ActiveRecord Relation,它基本上是一个结果数组,即使该结果集中只有一个记录。

尝试打电话ProductType.where(...whatever...).first.id,看看是否能解决您的问题。

二、更好的办法:

只需将产品保存到局部变量即可。

ProductType.delete_all
furniture = ProductType.create(:name => 'Furniture')

Product.delete_all
Product.create(:name => 'Chair', :type => furniture, :packaging => '2 for $20', :price_per => 0.1, :default_packaging_number => 2)
Run Code Online (Sandbox Code Playgroud)

确保使用正确的关联名称(我猜是类型...)。

注意ActiveRecord 已经将“类型”列用于多态和单表继承关系。如果您的关联设置为产品和 ProductTypes 之间的关系称为“类型”,那么您可能会产生冲突,或者将来可能会发生冲突。最好不要将其用作列名。

为什么不坚持默认?如果Product belongs_to ProductType那么默认列名将是product_type_id

最后一个选择:

如果您在播种时重置数据库(可能是一个好主意),那么您不需要调用Product.delete_all,数据库已经是空的。

在这种情况下,您可以这样做ProductType.find(1)- 如果您刚刚开始创建记录,则 ID 将按照您创建它们的顺序为 1、2、3 等。

希望能帮到你,有问题欢迎提问!