Rails - 如何在有 has_one 关联的地方搜索控制台
Rails - how to search the console where there is a has_one association
我想弄清楚我需要做什么才能在我的视图中使用关联。关联是 has_one 关系时出现问题。
我有名为项目和包的模型。这些协会是:
Project has_one :package
Package belongs_to :project
在控制台中,我可以写:
p = Project.where(id: 26)
这给了我一个项目。然后我写:
p.package
我希望它能给我相关的包。相反,我收到一条以这些行开头的长错误消息:
NoMethodError: undefined method `package' for #<Project::ActiveRecord_Relation:0x007fb275c17698>
我不知道这条消息是什么意思。我特别困惑,因为我可以写:
p = Package.find_by(project_id:26)
这给了我正确的包裹。
p = Package.find_by(project_id:26)
Package Load (1.8ms) SELECT "packages".* FROM "packages" WHERE "packages"."project_id" = LIMIT 1 [["project_id", 26]]
=> #<Package id: 25, project_id: 26, created_at: "2016-08-18 23:16:06", updated_at: "2016-08-24 05:11:11", has_gallery: nil>
为什么在控制台写p.package找不到包?
我看过this post,但我还不明白发生了什么事情的要点。
where
returns 相关对象的数组(通常与 has_many
关联一起使用)。如果只有一个关联对象,它仍然会 return 它在一个数组中。
find_by
在 SQL 查询结束时生成 LIMIT 1
并且 return 只有一个实例。
您不能在数组上调用 package
,因为 ActiveRecord_Relation
数组不知道关联。只有 Project
个对象知道方法 package
。这就是为什么 Project.where(id: something).package
行不通而 Project.find_by(id: something).package
行的原因。
如果你想在使用 where
时调用 package
,你必须选择一个对象(就像从任何其他数组中一样)- Project.where(id: something).first.package
- 这将调用 package
在数组的第一个元素上,这将起作用
我想弄清楚我需要做什么才能在我的视图中使用关联。关联是 has_one 关系时出现问题。
我有名为项目和包的模型。这些协会是:
Project has_one :package
Package belongs_to :project
在控制台中,我可以写:
p = Project.where(id: 26)
这给了我一个项目。然后我写:
p.package
我希望它能给我相关的包。相反,我收到一条以这些行开头的长错误消息:
NoMethodError: undefined method `package' for #<Project::ActiveRecord_Relation:0x007fb275c17698>
我不知道这条消息是什么意思。我特别困惑,因为我可以写:
p = Package.find_by(project_id:26)
这给了我正确的包裹。
p = Package.find_by(project_id:26)
Package Load (1.8ms) SELECT "packages".* FROM "packages" WHERE "packages"."project_id" = LIMIT 1 [["project_id", 26]]
=> #<Package id: 25, project_id: 26, created_at: "2016-08-18 23:16:06", updated_at: "2016-08-24 05:11:11", has_gallery: nil>
为什么在控制台写p.package找不到包?
我看过this post,但我还不明白发生了什么事情的要点。
where
returns 相关对象的数组(通常与 has_many
关联一起使用)。如果只有一个关联对象,它仍然会 return 它在一个数组中。
find_by
在 SQL 查询结束时生成 LIMIT 1
并且 return 只有一个实例。
您不能在数组上调用 package
,因为 ActiveRecord_Relation
数组不知道关联。只有 Project
个对象知道方法 package
。这就是为什么 Project.where(id: something).package
行不通而 Project.find_by(id: something).package
行的原因。
如果你想在使用 where
时调用 package
,你必须选择一个对象(就像从任何其他数组中一样)- Project.where(id: something).first.package
- 这将调用 package
在数组的第一个元素上,这将起作用