2016-02-05 91 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您能寫出錯誤信息嗎? –

相關問題