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,工作类型。
处理此问题的最佳方法是什么?
答案 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_id
和user_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上。在最小查询中从多个表中选择一组对象非常棒。