仅选择引擎之间的关联

时间:2015-01-23 16:39:33

标签: ruby-on-rails ruby-on-rails-4 activerecord

我需要抓住所有拥有应用程序的用户。 User是我的核心引擎的一部分,许多其他引擎都使用它。我想让用户不知道正在使用它的内容,这就是为什么我不想在我的has_many :training_applications模型中添加User

以下是课程

module Account
  class User < ActiveRecord::Base

  end
end


module Training
  class TrainingApplication < ActiveRecord::Base

    belongs_to :user, class: Account::User

  end
end

以下显然不会起作用,因为User没有TrainingApplication的概念:

Account::User.joins(:training_application).distinct

是否有一种优雅的方式可以返回与User相关联的TrainingApplication个对象的独特集合?

我作为快速解决方案获得的是

Account::User.where(id: Training::TrainingApplication.all.pluck(:user_id))

但我认为这是一个更好的解决方案。

1 个答案:

答案 0 :(得分:1)

如果您无法向用户添加has_many :training_applications关联,则以下内容应该是合适的解决方案:

您可以自己输入联接字符串:

t1 = Account::User.table_name
t2 = Training::TrainingApplication.table_name

Account::User.
joins("INNER JOINS #{t2} ON #{t2}.user_id = #{t1}.id").
group("#{t1}.id")

为了多样性,我还要介绍子查询方法:

Account::User.where("id IN (SELECT user_id FROM #{t2})")

我会使用joins方法,但我相信这两种解决方案都会比您当前的实施方案更快。