使用联接创建正确的查询

时间:2016-05-03 13:08:12

标签: ruby-on-rails ruby

如果我发布这样一个微不足道的问题,我感到非常抱歉,但我真的被困住了,谷歌无法帮助我,也许是因为我是Ruby on Rails的新手。

我有两张桌子:

id:整数
name:String

地址
id:整数
person_id:整数
name:String

我想检索与Person加入的Address。此代码段有效,但前提是此人实际上有可用的地址:

@person = Person.where('person.id' => params[:id])
                 .joins(:address)
                 .select('person.id as id, address.id as aid, person.name as name, address.name as aname').first

我的观点:

<h2><%= @person.name %></h2>
<p><%= @person.aname %></p>

也许我做了一些概念错误的事情。正如我所说,只要Person有相关Address,我的视图就会显示它,否则如果没有Address则会显示错误。

1 个答案:

答案 0 :(得分:2)

您可以考虑使用.includes(:relation)方法生成LEFT OUTER JOIN查询。另外,请考虑使用.find(:id)方法查找具有特定主键的人员。这将使您的查询更简单。

@person = Person.find(params[:id]).includes(:address)

此外,您可能希望在视图中调用地址字段,如下所示:

<h2><%= @person.name %></h2>
<p><%= @person.address.try(:name) %></p>

注意:在地址(@person.address.name)上调用名称违反了Law of Demeter,您应该考虑在address_name课程中添加Person方法。在rails中,您可以使用delegates :x, to: :y语法。