我有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.users
与User.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
答案 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