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 在数组的第一个元素上,这将起作用