如何在rails中将多个表与一对一关系连接起来

时间:2009-06-25 02:48:14

标签: ruby-on-rails join

Ruby on Rails对我来说是一个新手。我试图从3个不同的表中检索一组列。我以为我可以使用SQL视图来检索我的结果,但无法找到在Rails中使用视图的方法。这是我的表格。 1)用户表 - >用户名,密码和电子邮件 2)UserDetails表 - >外键:user_id,name,address1,city等。 3)UserWorkDetails - >外键:user_id,工作地址1,工作类型等

这3个表有一对一的关系。因此,表2属于表1,表3也属于表1.表1有一个用户详细信息和一个用户工作细节。

我希望使用联接获取用户电子邮件,姓名,地址1,城市,工作地址1,工作类型。

处理此问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

数据在模型中。其他一切只是一种优化。例如,address1位于user.user_detail.address1

如果你有

class User
  has_one :user_detail
  has_one :user_work_detail
end
class UserDetail
  belongs_to :user
end
class UserWorkDetail
  belongs_to :user
end

在名为user_iduser_details的表格中有user_work_details列,然后其他所有内容都会为您完成。 如果您以后需要优化,您可以:包含所拥有的模型,但并不是所有工作都必须。

答案 1 :(得分:2)

要快速获取所需内容,请使用:include选项在查询主表时包含其他表,所以:

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details])

这将只是一次加载表中的所有字段,因此只执行了一个查询,然后您可以使用对象执行所需的操作,因为它们将包含所有用户数据。

我发现这很简单且充足,在你知道瓶颈所在之前,你没有过早优化。

但是,如果您真的只想加载必填字段,请使用:select选项以及ActiveRecord::Base find方法:

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details], :select => "id, email, name, address1, city, work_address1")

虽然我的SQL目前有点生疏。

答案 2 :(得分:-3)

User.find(:first, :joins => [:user_work_details, :user_details], :conditions => {:id => id})

我会说尝试只选择你想要的字段是一个过早的优化,但你可以用一个复杂的:select hash。

:include将执行3次选择,1次在用户上,1次在user_details上,1次在user_work_details上。在最小查询中从多个表中选择一组对象非常棒。

http://apidock.com/rails/ActiveRecord/Base/find/class

相关问题