2015-12-03 65 views
0

我有一个User模型:试图 '别名' 多态的has_many关系

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

Track模型(认为它是 '下面'):

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的行添加另一个多态关系。用户可以用笔记等“标记”另一个模型。因此,如果我将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> 

我甚至可以做到这一点还是我失去了一些东西简单吗?

UPDATE

基于答案下面我想通了:

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

回答

1

我不是这个100%,但你可以尝试:

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 

编辑:有一个brainfart,改变了“源”到那里:用户。这会告诉您使用您提供的其他属性实际执行查找的表。当然它不会在:轨迹

+0

关闭但它抛出的错误指向我猜测的正确方向:has_many:tracking_users,通过:: tracks,class_name:“User”,foreign_key:“user_id”,来源::工作的用户 –