2016-11-16 31 views
2

我有以下代码:Ruby on Rails ActiveRecord查找后有什么东西可以做?

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

有人能解释我这是什么.contacts部分做这行的结束?我试图弄清楚,但我找不到答案。我认为它必须是包含或某物的东西,但我真的不明白。对于任何建议真的很高兴(也许只有一个解释链接就足够了,我试图找到一些东西,但我不知道我要搜索什么,因为我不知道这是什么..)

+0

确保选择一个答案,最符合您的问题并勾选它。这样你让其他用户知道,你的问题就解决了。 –

回答

2

find

Project.find(params[:project_id].to_i) # returns a Project instance 

,然后单个项目对象获取其相关contacts

它相当于

+0

非常感谢。现在我明白了一点。 :P仍然复杂,以了解整个程序正在做什么,但这就是为什么我想学习它的原因! 而thx的de to_i的意见,但我认为它不坏做?这个代码是API的一部分,当我不把这个to_i放到SQL注入中时,是不是有危险? – Twinfriends

+1

@Twinfriends欢迎您!将'params [:project_id]'转换为整数并不坏。至于SQL注入 - 因为'find'方法使用字符串或整数并构造一个查询,比如'SELECT projects。* FROM projects WHERE projects.id = $ 1'我认为它不容易被注入,但总的来说你是对的想要消毒传入的参数:) –

+0

再次,谢谢! :) – Twinfriends

4

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

您必须对您的Contact模型(app/models/contact.rb)您Project模型(app/models/project.rb)和belongs_to :project定义有一个has_many :contacts关系。

该协会是为你的数据库的projectscontacts表之间的关系的ActiveRecord的抽象,这意味着在projects表(即Project对象)一个行可以有多个联系人(即在contacts表中的许多行)的基础上contacts表中的外键project_id

在代码中,@contacts = Project.find(params[:project_id].to_i).contacts,所述find方法从projects表返回单个对象(Project模型)与作为params[:project_id]通过id列的值。然后.contacts返回contacts表中的所有关联行(值为project_id的行等于params[:project_id].to_i)。

在单个表格轨道activerecord操作中,以下行给出contacts表中的行的相同列表,其中列project_id的值为params[:project_id].to_i作为问题中的行。

@contacts = Contact.where(project_id: params[:project_id].to_i) 

这将返回所有行中contacts表具有project_id列等于params[:project_id].to_i值。

轨对activerecord associationsactive record

0
在你的问题 contacts

优秀的单证是一个正被调用的方法的结果,这是所谓的另一个对象

在这种情况下,它发送的方法消息contacts添加到从find方法返回的ActiveRecord对象上Project类别上调用

是否该结果能够响应该消息不是str如你所想。你经常会得到这样的错误在红宝石:

undefined method `contacts' for nil:NilClass 

然而,这是不太可能,因为find方法抛出一个异常,如果它不能找到记录(而find_by返回nil)

在这种情况下不会发生请记住,在红宝石中,一切都是对象,方法调用可以链接在一起

相关问题