2016-02-05 54 views
0

我想查找一种方法来查询我的数据库,以便为所有匹配的记录返回一个关联的记录。例如:active_record返回所有匹配的记录对象的单个关联记录

如果一个用户有很多房子(房子属于一个用户),并且我需要获得所有的用户,并且每个用户都有一个关联的房子(比如第一个房子)。我如何去做这件事?

要阐述更多关于这个:

user A has houses 1, 2, 3 
user B has houses 4, 5, 6 
user C has houses 7, 8, 9 
  • 让所有的用户,我可以这样做:user.all
  • 得到一个用户的所有房子,我可以这样做:<user>.houses
  • 以获得用户与他们的房子,我可以加入查询:User.joins(:houses).where(<condition>)

但是,如果我想获得的所有用户,并与各房子,格式为:

user | house 
----------------- 
A  | 1 
B  | 4 
C  | 7 

我怎么能去呢?

该数据库是postgres。

更新:

我真正的模型如下:

class Product < ActiveRecord::Base 

    ... 

    has_many :product_pictures, :dependent => :destroy 
    accepts_nested_attributes_for :product_pictures, allow_destroy: true 
end 
+0

您使用了哪个数据库? –

+0

@JaehyunShin psql,带rails的postgress数据库 –

回答

1

添加关系到用户:

class User < ActiveRecord::Base 
    # Your current code 
    has_one :house, -> { where('houses.id IN (SELECT min(id) FROM houses GROUP BY user_id)')} 
end 

然后,您的查询将是:

users = User.joins(:house) 

- 更新 在如果您想过滤结果,请自由添加where子句

users = User.joins(:house).where(your_filter_conditions) 
+0

如何获得所有用户?在这种情况下,'your_conditions'会是什么? –

+0

如果你想过滤结果,检查我的更新,使用'your_conditions' btw'User.joins(:hourse)'足以选择所有用户的第一个小时! –

+0

你能确认这是对psql的查询吗,我收到错误了。 –

0
result = User.joins(:houses).select("users.*, SOMEFUNCTION(houses.id) AS house_id").group(:id) 

# you can access single house id like 
result.first.house_id 

您可以选择其中内部ID要选择SOMEFUNCTION

如果你使用PostgreSQL,

User.joins(:houses).select("users.*, (array_agg(houses.id))[1] AS house_id").group(:id) 
+0

可以与一个用户一起工作,但可以与多个用户打交道。 –

+0

@SunnyK您能写出错误信息吗? –