我试图找出在视图中使用关联需要做些什么。如果关联是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,但我还没有理解所发生的事情的主旨。
答案 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
数组的第一个元素,它将起作用