Rails 2:join和:include resultset

时间:2010-07-12 19:15:50

标签: ruby-on-rails database activerecord select inner-join

使用activerecord从数据库中获取内容时,我想在两个表中获取具有指定列的自定义结果集。

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表所具有的列,并且不会允许获取cities表的列,即使它们已在select中指定。

我应该使用:加入还是:包含?知道发生了什么事吗?

3 个答案:

答案 0 :(得分:3)

如果您对连接的列名称进行别名,则返回的对象应具有别名的属性,即

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

在您的情况下,:joins适用于:include

我在我的设置中检查了这个,它适用于我(我在Rails 2.3.8上)

答案 1 :(得分: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)

答案 2 :(得分:0)

如果您不需要所有列,则可以在用户表中使用特定列名来代替“users。*”。我认为它很好的编程实践。

u = User.first(:joins =>:cities,       :select => “users.name,users.username,users.age,users.city_id,cities.name AS city_name”)

u.city_name#返回city_name。