2012-08-03 184 views
0

我試圖從軌查詢我的Postgres數據庫用下面的查詢查詢活動記錄

def is_manager(team) 
    User.where("manager <> 0 AND team_id == :team_id", {:team_id => team.id}) 
    end 

這主要是檢查該經理被標記,並且在那team.id是傳遞給函數的電流id 。

我有我的觀點

%td= is_manager(team) 

錯誤,或者我們得到什麼樣的回報下面的代碼是

#<ActiveRecord::Relation:0xa3ae51c> 

在哪裏我出了問題將是巨大的

回答

1

查詢到的ActiveRecord總是返回的ActiveRecord ::關係。這樣做基本上允許延遲加載查詢。要理解爲什麼這是很酷的,想想看:

User.where(manager: 0).where(team_id: team_id).first 

在這種情況下,我們得到誰不是經理的所有用戶,然後我們得到了所有誰是團隊ID TEAM_ID非管理員用戶,那麼我們選擇第一個。執行此代碼會給你喜歡的查詢:

SELECT * FROM users WHERE manager = 0 AND team_id = X LIMIT 1 

正如你所看到的,即使有在我們的代碼做多個查詢,ActiveRecord的是能夠壓扁了這一切分解成一個查詢。這是通過關係完成的。只要我們需要實際的對象(即當我們先調用),那麼ActiveRecord就會去DB來獲取記錄。這可以防止不必要的查詢ActiveRecord能夠做到這一點,因爲它們返回關係,而不是查詢的對象。想到Relation類的最好方法是它是一個包含數組所有方法的ActiveRecord實例。你可以調用一個關係的查詢,但你也可以迭代它。

對不起,如果不明確。

哦,並解決你的問題。 %td = is_manager(team).to_a這會將Relation對象轉換爲用戶數組。

+0

查詢工作,雖然與陣列,我如何從它內部訪問信息?即說我想在名爲first_name的列中提取管理者名稱? – 2012-08-03 15:24:56

+1

'is_manager(team).map {| m | m.first_name}'將返回一個包含所有經理名字的數組。您也可以使用如下的地圖縮寫:'is_manager(team).map(&:first_name)'。 – Max 2012-08-03 16:06:33

+0

下一個問題,我有最大,如果我有以下'def全名(用戶) 「#{user.first_name}#{user.last_name}」 結束',並希望返回full_name沒有方括號和引用逗號是什麼被需要?因爲我嘗試了'is_manager(team).map(&:full_name)'儘管它沒有工作。謝謝 – 2012-08-04 11:02:38

0

就任何幫助用.first檢索第一條記錄,這可能會有所幫助。 User.where( 「經理<> 0 AND TEAM_ID ==:TEAM_ID」,{:TEAM_ID => team.id})。第一

+0

問題是可能有多個經理分配給一個團隊,因爲我希望能夠列出他們 – 2012-08-03 14:39:51