基本上,我想要做的是用一堆初始数据为我的网络应用程序设置我的数据库。例如,有一个产品列表,所有产品都具有一个 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 ?我需要修改权限或其他东西才能访问它吗?
第一的:
当您调用时,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 等。
希望能帮到你,有问题欢迎提问!
| 归档时间: |
|
| 查看次数: |
1066 次 |
| 最近记录: |