尝试 'alias' 多态 has_many 关系

Trying to 'alias' a polymorphic has_many relationship

我有一个 User 型号:

class User < ActiveRecord::Base
   has_many :tracks, dependent: :destroy
   has_many :tracked_locations, through: :tracks, source: :tracking, source_type: 'Location'

和一个 Track 模型(将其视为 'following'):

class Track < ActiveRecord::Base
  belongs_to :user
  belongs_to :tracking, polymorphic: true
end

这里的想法是我将有很多模型要跟踪/跟随,所以我使用多态性。例如我有一个 Location 模型:

class Location < ActiveRecord::Base
  has_many :tracks, :as => :tracking, :dependent => :destroy
  has_many :users, through: :tracks

现在在控制台中 Location.first.usersUser.first.tracked_locations 一起工作正常。

现在我将按照 Flagged 添加另一个多态关系。用户可以 'flag' 另一个带有注释等的模型。因此,如果我将 has_many :users, through: :flagged 添加到 Location 模型,例如我需要区分跟踪用户和标记用户。

我试过了:

  has_many :tracking_users, through: :tracks, source: :tracking, source_type: 'User'

但我得到:

NoMethodError: undefined method `evaluators_for' for #<Location:0x007ff29e5409c8>

我什至可以这样做吗?还是我错过了一些简单的东西?

更新

根据下面的答案我想通了:

has_many :tracking_users, through: :tracks, class_name: "User", foreign_key: "user_id", source: :user

我对此不是 100%,但你可以试试:

has_many :tracking_users, through: :tracks, class_name: "User", foreign_key: "user_id", source: :user

或者您也可以只创建一个 class 方法并手动完成。

def self.tracking_users
  user_ids = tracks.collect(&:user_id)
  User.where(id: user_ids)
end

编辑:脑洞大开,将上面的 "source" 更改为 :user。这告诉 table 实际使用您提供的其他属性进行查找。当然它不会在 :tracks