Rails 2:连接和:包含结果集
问题描述:
当使用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?任何想法发生了什么?
答
如果别名联接的列名,然后返回的对象应该有别名的属性,即
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)
答
在您返回的实例中,如果列的名称是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)
答
可以代替user表中使用特定的列名“的用户。*”如果你不需要所有柱。我认为它的编程习惯很好。
U = User.first(:加入=>:城市, :选择=> “users.name,users.username,users.age,users.city_id,cities.name AS CITY_NAME”)
u.city_name#返回city_name。