2013-02-28 61 views
0

我是RoR 3中的新成員,並且遇到問題。 我有一個類User這樣獲取RoR 3中關聯的所有記錄

class User < ActiveRecord::Base 
    attr_accessible :firstname, :lastname, :login, :password, :rank, :sa_id, 
    belongs_to :role 
    belongs_to :company 
end 

當我控制我得到第一個用戶(例如)User.first我可以訪問User.first.role

是否可以獲取所有用戶,包括belongs_to的對象? 結果會是所有的用戶和每個用戶的角色類型的對象和公司類型的對象?

感謝

回答

3

我不知道如果這是你在找什麼,但你可以貪婪加載的關聯,以便只有1請求被髮送到數據庫(實際上是3,一個是用戶,一個用於角色,以及一個用於公司)

>> users = User.includes(:role, :company) 
>> users.each do |user| 
    puts user.role 
    puts user.company 
    end 

UPDATE:渲染JSON,使用

respond_with(@user) do |format| 
    format.json { render json: @user.to_json(methods: [:company, :role] } 
end 
+0

不那麼肯定.includes必要這將獲取所有用戶。是嗎 ? – C404 2013-02-28 12:36:59

+2

這是如果你想急於加載。如果你不這樣做,你每次訪問'user.role'和'user.company'時都必須查詢數據庫。 – jvnill 2013-02-28 12:38:23

+0

謝謝,但是這不會對返回的結果做任何改變。我仍然只有我的用戶。 User.includes(:role,:company)僅返回用戶列表,並且循環不會更改任何內容。 – Olivier 2013-02-28 12:47:24

0

如果您使用的腳手架,有也應該是一個產生index方法我在你的UsersController。

在那裏,你會看到這樣的事情:

@users = User.all 

這將提取所有用戶對象從數據庫。

現在您可以迭代這些用戶並像以前一樣訪問role字段。

但是:這使用延遲加載。意思是:對於每個訪問的role它將執行一個單獨的查詢。爲了解決這個問題用「預先加載」(http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations):

@users = User.includes(:role) 

與它相關的角色在一個查詢

+0

不幸的是,這似乎並沒有工作。我的索引是users = User.includes(:role) users.each do | user | puts user.role end respond_with users 我正在使用respond_to:json(它很重要)。 – Olivier 2013-02-28 13:04:58

+1

好的,你的問題是關於'render json'而不是關於查詢本身。爲了在json輸出中包含東西,事情幾乎是一樣的:使用'include'。看看這裏的例子:http://stackoverflow.com/a/612475/1321564 – 2013-02-28 13:12:11

相關問題