根据具体情况从3个不同的表中获取值

时间:2012-10-31 12:25:25

标签: sql ruby-on-rails database ruby-on-rails-2

我的数据库中有3个表

  1. 用户(id,用户名,电子邮件,密码等)
  2. 制作人(id,user_id)
  3. 地址(first_name,city,addressable_id等)
  4. 制作人与User表(User.id = Producer.user_id)和地址表(p.id = Address.addressable_id)有链接

    现在我想用他的用户名

    获取所有制作人地址

    我正在尝试以下查询,但它没有给出预期的输出

    select u.login, p.id, a.city from producers p
    
    join users u on u.id = p.user_id
    
    join addresses a on a.addressable_id = p.id
    

    我的模特和关系

    user.rb

    class User < ActiveRecord::Base
      has_one :customer
      has_one :producer
    end
    

    producer.rb

    class Producer < ActiveRecord::Base
      belongs_to :user
      belongs_to :updated_by_user, :class_name => "User", :foreign_key => "updated_by_user_id"
    
      has_one :address, :as => :addressable
      has_many :items  
    end
    

    address.rb

    class Address < ActiveRecord::Base
      belongs_to :addressable, :polymorphic => true
    
      belongs_to :updated_by_user, :class_name => "User", :foreign_key => "updated_by_user_id"
    end
    

2 个答案:

答案 0 :(得分:2)

您需要使用#select ActiveRecord::Relation的{​​{1}}方法。{/ p>

Rails 3.X:

Producer.joins(:user, :address).select("users.login, producers.id, addresses.city")

Rails 2.X:

Producer.all(:joins => [:user, :address], :select => "users.login, producers.id, addresses.city")

答案 1 :(得分:1)

您的查询看起来不错。

尝试从“加入”更改为“左连接”,看看结果是什么。

select u.login, p.id, a.city from producers p

left join users u on u.id = p.user_id

left join addresses a on a.addressable_id = p.id

背后的原因是可能缺少其中一个ID,从而删除了整个结果。 如果是这种情况,您将能够看到一些具有NULL值的列。