【问题标题】:Rails - how to search the console where there is a has_one associationRails - 如何搜索有 has_one 关联的控制台
【发布时间】:2016-08-27 07:59:36
【问题描述】:

我试图弄清楚我需要做什么才能在我的视图中使用关联。关联是 has_one 关系的地方有问题。

我有名为 Project 和 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,但我不明白发生了什么。

【问题讨论】:

  • 你是如何调用你的外键的,你把它们放在哪个表中
  • @Chris - 你是什么意思?项目有一个 id 并且由于包属于项目,所以包表中有一个 project_id 键

标签: ruby-on-rails rails-console


【解决方案1】:

where 返回相关对象的数组(通常与has_many 关联使用)。如果只有一个关联对象,它仍然会在一个数组中返回它。

find_by 在 SQL 查询结束时生成LIMIT 1,并且只返回一个实例。

您不能在数组上调用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,这会工作

【讨论】:

  • 谢谢。这确实可以获取包,但是我想通过执行以下操作查看包表上的属性:p.has_participants(has_participants 是包表中的一个属性),但我得到:p.has_participants NoMethodError:未定义方法`has_participants ' for #<0x007fe1751a0a78>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多