【问题标题】:Rails 5 ActiveRecord Query - Possible to join 3 tables?Rails 5 ActiveRecord 查询 - 可以加入 3 个表吗?
【发布时间】:2017-06-29 04:04:29
【问题描述】:

鉴于以下模型:

User: id
UserPosition: user_id, job_title_id
JobTitle: id | title

使用 Rails 5,我该怎么做:

current_user.job_title

我需要查找UserPosition 然后JobTitle 以获取title

这可以通过一个查询来实现吗?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql activerecord ruby-on-rails-5


    【解决方案1】:

    你可以通过这样的关联来做到这一点:

    class User < ApplicationRecord
      has_many :user_positions
      has_many :job_titles, through: :user_positions
    end
    
    class UserPositions < ApplicationRecord
      belongs_to :user
      belongs_to :job_title
    end
    
    class JobTitle < ApplicationRecord
      has_many :user_positions
      has_many :users, through: :user_positions
    end
    

    这里是 the documentation,用于 Rails 中的多对多关系。

    【讨论】:

      【解决方案2】:

      将您的关系定义为:

      class User < ApplicationRecord
        has_many :user_positions
      end
      
      class JobTitle < ApplicationRecord
        has_many :user_positions
      end
      
      class UserPosition < ApplicationRecord
        belongs_to :user
        belongs_to :job_title
      end
      

      然后您可以使用joins,通过user 模型,使用job_titleuser_position,并且知道user.id,那么您可以使用pluck 来获取所需的属性:

      User.joins(user_positions: :job_title).where(id: 1).pluck('job_titles.title')
      

      这会给你一个类似的 SQL 查询:

      SELECT job_titles.title 
      FROM "users" 
      INNER JOIN "user_positions" 
      ON "user_positions"."user_id" = "users"."id" 
      INNER JOIN "job_titles" 
      ON "job_titles"."id" = "user_positions"."job_title_id" 
      WHERE (users.id = 1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多