设置多态关联

时间:2012-01-17 06:20:57

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试向我的网站添加“跟随”功能,但我无法找到使用多态关联的正确方法。用户需要能够遵循3个不同的类,这3个类不会跟随用户。我在过去创建了一个跟随用户的用户,但事实证明这更加困难。

我的迁移是

 class CreateRelationships < ActiveRecord::Migration
  def change
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :relations_id   
      t.string :relations_type    
      t.timestamps
    end
  end
 end

我的关系模型是

class Relationship < ActiveRecord::Base
  attr_accessible :relations_id
  belongs_to :relations, :polymorphic => true
  has_many :followers, :class_name => "User"
end

在我的用户模型中

has_many :relationships, :foreign_key => "supporter_id", :dependent => :destroy

和其他3个模型

has_many :relationships, :as => :relations

我错过了设置此关联的内容吗?

1 个答案:

答案 0 :(得分:5)

你基本上是正确的,除了一些小错误:

  • attr_accessible :relations_id是多余的。将其从Relationship型号中删除。

  • RelationshipUser模型都会调用has_many来相互关联。 Relationship应调用belongs_to,因为它包含外键。

  • User模型中,设置:foreign_key => "follower_id"


我会这样做。

Follow内容方面有一个followable中间类,多边形关联,follower用户端有一个has_many(用户有很多跟随)。

首先,创建一个follows表:

class CreateFollows < ActiveRecord::Migration
  def change
    create_table :follows do |t|
      t.integer :follower_id
      t.references :followable, :polymorphic => true
      t.timestamps
    end
  end
end

Relationship模型替换为Follow模型:

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

加入User模型:

has_many :follows, :foreign_key => :follower_id

包含在您的三个可跟随的课程中:

has_many :follows, :as => :followable

您现在可以执行此操作:

TheContent.follows   # => [Follow,...]  # Useful for counting "N followers"
User.follows         # => [Follow,...]
Follow.follower      # => User
Follow.followable    # => TheContent