试着别名'多态的has_many关系

时间:2015-12-03 06:27:21

标签: ruby-on-rails activerecord polymorphic-associations

我有User型号:

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

Track模型(将其视为&#39;关注&#39;):

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的行中添加另一个多态关系。用户可以标记&#39;带有注释等的另一个模型。例如,如果我将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

1 个答案:

答案 0 :(得分:1)

我不是百分之百,但你可以尝试:

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

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

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

编辑:有一个脑筋,将“源”改为:用户。这告诉您使用您提供的其他属性实际查找哪个表。当然它不会出现在:track