在播种数据时查找id

时间:2011-07-16 00:19:59

标签: 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)

现在,我的问题是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?我是否需要修改权限或访问它?

3 个答案:

答案 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')