基本上,我要做的是用我的网络应用程序的一堆初始数据为我的数据库播种。例如,有一个产品列表都有一个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
问题在于,当我这样做时,我会收到一个很大的数字(70247318042560),这显然不是id。控制台还会返回警告
warning Object#id will be deprecated; use Object#object_id
当我在where语句的末尾使用.object_id时,它仍会返回相同的大且不正确的数字。
如何从数据库中提取家具ProductType的ID?我是否需要修改权限或访问它?
答案 0 :(得分:4)
首先:
当你调用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)
确保使用正确的关联名称(我猜测类型......)。
注意 ActiveRecord已经将“Type”列用于多态和单表继承关系。如果您设置的关联是将产品和ProductTypes之间的关系称为“类型”,那么您可能会产生冲突,或者您可能会在将来发生冲突。最好不要将它用作列名。
为什么不坚持默认?如果Product belongs_to ProductType
,则默认列名称为product_type_id
最后的选择:
如果您在播种时重置数据库(可能是个好主意),那么您不需要调用Product.delete_all
,数据库已经为空。
在这种情况下,您可以ProductType.find(1)
- 如果您刚刚开始创建记录,则ID将按照您创建的顺序为1,2,3等。
希望这有帮助,随时提问!
答案 1 :(得分:1)
应该是:
:type_id => ProductType.where(:name => "Furniture").first.id
要获取新创建的项目的ID,请执行:
@product = Product.create(:name => 'Chair', :type_id => ProductType.first.id, :packaging => '2 for $20', :price_per => 0.1, :default_packaging_number => 2)
@product.id
答案 2 :(得分:0)
也许这对你有用:
:type_id => ProductType.where(:name => "Furniture").find(:select => 'id')