同一类上的多态多对多

时间:2014-12-13 08:03:31

标签: ruby-on-rails

我有用户,标记和关系模型

class User < ActiveRecord::Base
    has_many :followers, :as => :followable
    has_many :follows, class_name: "Relationship", :foreign_key => :follower_id
end

class  Tag < ActiveRecord::Base
    has_many :followers, :as => :followable
end

class Relationship < ActiveRecord::Base
  belongs_to :followable, polymorphic: true
  belongs_to :follower, :class_name => "User"
end

用户可以关注其他用户或标签。我想访问标签和用户的关注者,还可以找出用户关注的用户/标签。

我目前收到以下错误:

2.1.1 :003 > user.followers
NameError: uninitialized constant User::Follower
2.1.1 :005 > tag.followers
NameError: uninitialized constant Tag::Follower

2 个答案:

答案 0 :(得分:0)

在您的关联中添加class_name选项,如:

has_many :followers, :as => :followable, class_name: "Relationship"

您需要添加此项,因为默认情况下,rails会为您的关联名称查找匹配的模型名称(单数)。

如果您不想使用:class_name,则需要将Relationship模型的名称更改为Follower

答案 1 :(得分:0)

尝试以下代码(我不知道它是否有效):

class User < ActiveRecord::Base
   has_many :relationships, as: followable
   has_many :followers, through: relationships, class_name: :User
end

class Tag < ActiveRecord::Base
   has_many :relationships, as: followable
   has_many :followers, through: relationships, class_name: :Tag
end

class Relationship < ActiveRecord::Base
   belongs_to :followable, polymorphic: true
end

Relationship架构:

t.integer :followable_id
t.string :followable_type

但我强烈建议使用Single Table Inheritance代替。当然,如果您希望优化数据库模式,只需显示您想要的关系。