尝试 '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.users
与 User.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
我有一个 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.users
与 User.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