2010-07-12 77 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。