ruby-on-rails - 播种数据时查找 ID

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

问题是当我这样做时,我得到一个明显不是 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/

相关文章:

ruby-on-rails - gem make_flagable

mysql - Rails 4 中 'users' 中的未知列 'where clause'

ruby-on-rails - Array.count 在本地工作正常但在 heroku 上中断

ruby-on-rails - 高级 Rails 调试的策略建议?

ruby-on-rails - rails : Model instance method or helper method?

ruby-on-rails - RSpec 测试索引 View 和 will_paginate

ruby-on-rails - 如何为静态资源创建 "edit"url?

ruby-on-rails - WickedPdf 在生产中不显示来自 S3 的远程图像

ruby-on-rails - 仅在服务器启动时运行的功能

ruby-on-rails - 如何处理 protect_from_forgery 以使 Rails 应用程序进行通信?