【问题标题】:ActiveRecord "where" query using join table methodActiveRecord“where”查询使用连接表方法
【发布时间】:2015-10-31 19:40:13
【问题描述】:

我有以下模型:项目、开发人员和主题。我还有一些连接表:ProjectTopic 和 DeveloperTopic。

我希望能够找到与给定项目实例具有相同主题的所有开发人员。我可以通过 Project.first.topics 获取项目的主题,但我不能使用主题列进行 Developer.where 查询,因为它不存在 - 它只是通过连接表/通过关联创建的方法。

如何找到与给定项目具有相同主题的所有开发人员?

class Developer < ActiveRecord::Base
  has_many :projects
  has_many :developer_technologies
  has_many :technologies, through: :developer_technologies
  has_many :developer_topics
  has_many :topics, through: :developer_topics

end

class Project < ActiveRecord::Base
  has_many   :technologies, through: :project_technologies
  has_many   :topics, through: :project_topics
  has_many   :project_technologies
  has_many   :project_topics
  belongs_to :customer
  belongs_to :developer

end

class ProjectTopic < ActiveRecord::Base
  belongs_to :project
  belongs_to :topic
end

class Topic < ActiveRecord::Base
  has_many :developers
  has_many :developer_technologies, through: :developers
  has_many :projects
  has_many :project_technologies, through: :project

end

class DeveloperTopic < ActiveRecord::Base
  belongs_to :developer
  belongs_to :topic
end

【问题讨论】:

    标签: ruby-on-rails join activerecord has-many-through model-associations


    【解决方案1】:

    对此不太确定,但值得一试:

    class Developer < ActiveRecord::Base
    def find_whatever(project)
        includes(:topic).where("topics.project_id" => project.topics_ids)
    end
    

    您需要将 topic_ids 委托给项目。

    【讨论】:

      【解决方案2】:

      如果一个项目有主题 [A、B、C],而开发人员有主题 [C、D、E],这是否算作您要查找的内容,因为他们都共享主题 C?或者你的意思是开发者必须有确切的 [A, B, C] 并且可能还有其他一些主题?

      如果您想要第一种情况,那么我认为您应该能够通过首先执行 Project.first.topics.includes(:developers) 来让开发人员与每个主题相关联。然后是一些如何将开发人员合并到一个列表中。

      请注意,在您的主题模型中,您可能应该通过您拥有的 DeveloperTopic 连接表连接到开发人员表,而不是直接进行。

      【讨论】:

        【解决方案3】:

        通过遍历所有开发人员并在每个开发人员上调用 .topics 来实现此功能,然后根据项目的主题对其进行检查,如果匹配,则将开发人员推送到数组中。

        【讨论】:

        • 你也可以直接通过你的查询来做到这一点,让数据库只返回需要的数据,让你的应用尽可能的轻量级。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多