2010-07-12 76 views
1

當使用activerecord從數據庫中獲取內容時,我想要在兩個表中獲取具有指定列的自定義結果集。Rails 2:連接和:包含結果集

SELECT users.name, users.username, users.age, users.city_id, cities.name as city_name FROM users INNER JOIN cities ON users.city_id = cities.id 

這將是AR作爲

Users.find(:all, 
    :joins => :cities, 
    :select => "users.name, users.username, users.age, users.city_id, 
     cities.name as city_name") 

但這僅返回用戶表的結果,而不是城市的結果。我100%確定內部聯接語句正在經歷(兩個表都正在聯接)。

看起來好像返回對象只有與模型相關的列。因此,UserModel只有users表具有的列,即使它們在select中指定,也不允許獲取城市表的列。

我應該使用:joins還是:include?任何想法發生了什麼?

回答

3

如果別名聯接的列名,然後返回的對象應該有別名的屬性,即

u = User.first(:joins => :cities, 
     :select => "users.*, cities.name AS city_name") 
u.city_name # returns the city_name. 

在你的情況,:joins:include合適。

我在設置檢查這個和它的作品對我來說(我on Rails的2.3.8)

1

在您返回的實例中,如果列的名稱是city_name,則應該使用user.city_name。或者,如果您使用:include,則您將告訴ActiveRecord加載關聯的城市模型,然後您將引用user.city.name。

總結:

users = User.find(:all, :joins => :cities, :select => "users.name, users.username, users.age, users.city_id, cities.name as city_name") 
users.map(&:city_name) 

users = User.find(:all, :include => :cities) 
users.map(&:city).map(&:name) 
0

可以代替user表中使用特定的列名「的用戶。*」如果你不需要所有柱。我認爲它的編程習慣很好。

U = User.first(:加入=>:城市, :選擇=> 「users.name,users.username,users.age,users.city_id,cities.name AS CITY_NAME」)

u.city_name#返回city_name。