active_record return 所有匹配记录对象的单个关联记录
active_record return single associated record for all matching record objects
我正在尝试找到一种方法来查询我的数据库,以 return 为所有匹配记录的每条关联记录。例如:
如果一个用户有很多房子,(一个房子属于一个用户),我需要得到所有的用户,每个用户都有一个关联的房子(比如第一间房子)。我该怎么做?
详细说明:
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
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
您可以选择SOMEFUNCTION
您想要select的房屋ID。
如果你使用 postgresql,
User.joins(:houses).select("users.*, (array_agg(houses.id))[1] AS house_id").group(:id)
添加与用户的关系:
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)
我正在尝试找到一种方法来查询我的数据库,以 return 为所有匹配记录的每条关联记录。例如:
如果一个用户有很多房子,(一个房子属于一个用户),我需要得到所有的用户,每个用户都有一个关联的房子(比如第一间房子)。我该怎么做?
详细说明:
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
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
您可以选择SOMEFUNCTION
您想要select的房屋ID。
如果你使用 postgresql,
User.joins(:houses).select("users.*, (array_agg(houses.id))[1] AS house_id").group(:id)
添加与用户的关系:
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)