代码之家  ›  专栏  ›  技术社区  ›  matsko

Rails 2:联接和:包含结果集

  •  1
  • matsko  · 技术社区  · 15 年前

    使用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")
    

    但这只返回用户表结果,而不返回城市结果。我百分之百确信内部联接语句正在执行(两个表都正在联接)。

    似乎返回对象只有与模型关联的列。因此,usermodel将只包含users表中的列,并且不允许提取cities表中的列,即使它们是在select中指定的。

    我应该使用:join还是:include?知道怎么回事吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Harish Shetty    15 年前

    如果将联接的列名称命名为别名,则返回的对象应具有别名属性,即。

    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上)

        2
  •  1
  •   François Beausoleil    15 年前

    在返回的实例中,如果列的名称是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)
    
        3
  •  0
  •   Mayank Jaimini    15 年前

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

    u=user.first(:joins=>:城市, :select=>“users.name,users.username,users.age,users.city_id,cities.name作为city_name”)。

    u.city_name返回城市名称。