Ruby on Rails ActiveRecord在查找后做了什么。

时间:2016-11-16 13:16:12

标签: ruby-on-rails ruby activerecord

我有以下代码:

@contacts = Project.find(params[:project_id].to_i).contacts

有人可以解释一下.contacts部分在这一行的末尾做了什么吗?我想弄清楚,但我找不到答案。我认为它必须像包含或某种东西,但我真的不明白。对于任何建议都会非常高兴(也许只有解释的链接就足够了。我试图找到一些东西,但我不知道我要搜索什么,因为我不知道这是什么......)

3 个答案:

答案 0 :(得分:4)

.contacts方法返回与您的Contact模型关联的Project个对象的集合。

您的has_many :contacts模型Project模型app/models/project.rb和[{1}}模型belongs_to :project上必须定义Contact关系app/models/contact.rb )。

此关联是数据库上projectscontacts表之间关系的活动记录抽象,表示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的所有行。

rails在activerecord associationsactive record

上提供了出色的文档

答案 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中,一切都是对象,方法调用可以链接