使用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中指定。
我应该使用:加入还是:包含?知道发生了什么事吗?
答案 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。