基本上,我要做的是为我的网络应用程序使用一堆初始数据来为我的数据库做种子。例如,有一个产品列表,所有产品都具有一个 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)
现在,我的问题是 ProductType.first.id
只是一个占位符。我真正想做的是放一些类似的东西:
:type_id => ProductType.where(:name => "Furniture").id
问题是当我这样做时,我得到一个明显不是 ID 的巨大数字 (70247318042560)。控制台也返回警告
warning Object#id will be deprecated; use Object#object_id
当我在 where 语句末尾使用 .object_id
时,它仍然返回同样大且不正确的数字。
如何从数据库中提取家具 ProductType
的 ID?我是否需要修改权限或其他内容才能访问它?
最佳答案
首先:
当您调用 ProductType.where()
时,您将获得一个 ActiveRecord 关系,它基本上是一组结果,即使该结果集中只有一条记录也是如此。
尝试调用 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)
确保您使用正确的关联名称(我猜类型...)。
注意 ActiveRecord 已经将“类型”列用于多态和单表继承关系。如果您在关联中设置了 Products 和 ProductTypes 之间的关系称为“类型”,那么您可能会造成冲突,或者您可能会在未来面临冲突的风险。最好不要将其用作列名。
为什么不坚持使用默认值?如果 Product belongs_to ProductType
,则默认列名称为 product_type_id
最后一个选择:
如果您在播种时重置您的数据库(可能是个好主意),那么您无需调用 Product.delete_all
,数据库将已经为空。
在这种情况下,您只需执行 ProductType.find(1)
- 如果您刚刚开始创建记录,则 ID 将按照您创建它们的顺序依次为 1、2、3 等。
希望对您有所帮助,欢迎提问!
关于ruby-on-rails - 播种数据时查找 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6714430/