Rails - 如何搜索有has_one关联的控制台

时间:2016-08-27 07:59:37

标签: ruby-on-rails rails-console

我试图找出在视图中使用关联需要做些什么。如果关联是has_one关系,则会出现问题。

我有名为Project and Package的模型。协会是:

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" = $1 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,但我还没有理解所发生的事情的主旨。

1 个答案:

答案 0 :(得分:0)

if {[regexp $pattern $var match]} { ^^^^^^^^^^^^^ 返回一组相关对象(通常与where关联一起使用)。如果只有一个关联对象,它仍将以数组形式返回。

has_many在SQL查询结束时生成find_by并仅返回一个实例。

您无法在数组上调用LIMIT 1,因为package数组对关联没有任何想法。只有ActiveRecord_Relation个对象知道方法Project。这就是package不起作用的原因,但Project.where(id: something).package将会起作用。

如果您想在使用Project.find_by(id: something).package时致电package,则必须选择一个对象(例如来自任何其他数组) - where - 这将调用Project.where(id: something).first.package数组的第一个元素,它将起作用