我有以下代码:
@contacts = Project.find(params[:project_id].to_i).contacts
有人可以解释一下.contacts
部分在这一行的末尾做了什么吗?我想弄清楚,但我找不到答案。我认为它必须像包含或某种东西,但我真的不明白。对于任何建议都会非常高兴(也许只有解释的链接就足够了。我试图找到一些东西,但我不知道我要搜索什么,因为我不知道这是什么......)
答案 0 :(得分:4)
.contacts
方法返回与您的Contact
模型关联的Project
个对象的集合。
您的has_many :contacts
模型Project
模型app/models/project.rb
和[{1}}模型belongs_to :project
上必须定义Contact
关系app/models/contact.rb
)。
此关联是数据库上projects
和contacts
表之间关系的活动记录抽象,表示projects
表上的一行(即Project
个对象)可以基于contacts
表上的外键project_id
拥有多个联系人(即contacts
表上的多行)。
在代码@contacts = Project.find(params[:project_id].to_i).contacts
中,find
方法从Project
表返回单个对象(projects
模型),其值为id
列}以params[:project_id]
传递。然后.contacts
返回contacts
表中的所有关联行(值project_id
等于params[:project_id].to_i
的行)。
在单个表rails trackrecord操作中,以下行提供contacts
表格中具有值project_id
的{{1}}列的相同行列表,作为您问题中的行。
params[:project_id].to_i
这将返回@contacts = Contact.where(project_id: params[:project_id].to_i)
表格中contacts
列的值等于project_id
的所有行。
答案 1 :(得分:2)
你find
一个项目对象
Project.find(params[:project_id].to_i) # returns a Project instance
然后获取其关联的contacts
。
相当于
project = Project.find(params[:project_id].to_i) # btw `find` accepts strings as well, so no need for `to_i`
project.contacts
答案 2 :(得分:0)
contacts
中的是在另一个对象上调用的方法的结果上调用的方法
在这种情况下,它向ActiveRecord对象发送消息contacts
,该消息是从find
类
Project
方法返回的
该结果是否能够响应该消息并不像您想象的那么简单。你经常在ruby中得到这样的错误:
undefined method `contacts' for nil:NilClass
但是,在这种情况下不太可能发生这种情况,因为如果找不到记录,find
方法会引发异常(而find_by
则返回nil)
请记住,在ruby中,一切都是对象,方法调用可以链接