Ruby on rails 在设定数据种子时查找id

Ruby on rails 在设定数据种子时查找id,ruby-on-rails,Ruby On Rails,基本上,我要做的是为我的web应用程序在数据库中植入一堆初始数据。例如,有一个产品列表,所有产品都有一种产品类型 Myseeds.rb具有以下代码: ProductType.delete_all ProductType.create(:name => 'Furniture') Product.delete_all Product.create(:name => 'Chair', :type_id => ProductType.first.id, :packaging =>

基本上,我要做的是为我的web应用程序在数据库中植入一堆初始数据。例如,有一个产品列表,所有产品都有一种产品类型

My
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\u id
时,它仍然返回同样大且不正确的数字

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

首先:

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

尝试调用
ProductType.where(…无论如何…).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”列用于多态和单表继承关系。如果您的关联设置为产品和产品类型之间的关系被称为“类型”,那么您可能正在创建冲突,或者您可能在将来面临冲突的风险。最好不要将其用作列名

为什么不坚持默认值呢?如果
产品属于\u ProductType
,则默认列名为
产品类型\u id

最后一种选择:

如果在播种时重置数据库(可能是个好主意),则无需调用
Product.delete\u all
,数据库将已为空

在这种情况下,您只需执行
ProductType.find(1)
——如果您刚刚开始创建记录,则ID将按照创建顺序为1、2、3等

希望这有帮助,请随时提问

应该是:

: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

也许这对你有用:

:type_id => ProductType.where(:name => "Furniture").find(:select => 'id')

如何
ProductType.where(:name=>“Furniture”).first.id
?注意:在上面的编辑中,我无意中在第一句话中漏掉了“array”一词,并添加了有关列名的详细信息。感谢您的回答。只是出于好奇,你说应该是Product属于ProductType。。。我这样做的方式是,我写的产品有一个ProductType,而ProductType属于Product。这个逻辑错了吗?我只是想,产品应该有一个产品类型,并且属于一个销售……如果你做的是一个产品类型,那么这并不重要,但一般来说,你会将较高级别的模型设置为“拥有”较低级别的模型,即一个类别“拥有”一个项目,而一个项目“属于”一个类别,而不是相反的方式……也就是说,我认为我们之间的关系是错误的。是否有不止一种“家具”产品?如果是这样,那么该ProductType应该有许多产品。否则,您将为与该类型关联的任何产品创建许多不同的ProductType:Furniture对象。如果您不想建立一对多的关系,那么产品类型应该只是一个字符串。如果您仅使用此模型存储产品类型的名称,则可能没有真正的原因而导致性能下降。因此,基本上,如果某个对象在1对多关系中被外键引用,则被引用的项是has\u many,而具有引用外键的表是所属的