Создание полиморфной ассоциации - PullRequest
1 голос
/ 17 января 2012

Я пытаюсь добавить на свой сайт функциональность, аналогичную следующей, но у меня возникают проблемы с поиском правильного способа использования полиморфной ассоциации.Пользователь должен быть в состоянии следовать за 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 Ответ

5 голосов
/ 17 января 2012

Вы в основном правильно, за исключением нескольких незначительных ошибок:

  • attr_accessible :relations_id является избыточным.Удалите его из вашей Relationship модели.

  • Обе модели Relationship и User вызывают has_many для связи друг с другом.Relationship должен вызывать belongs_to, поскольку он содержит внешний ключ.

  • В вашей модели User установите :foreign_key => "follower_id".


Вот как я бы это сделал.

Иметь средний класс Follow с полиморфной ассоциацией на стороне контента followable и has_many на стороне пользователя follower (у пользователя много подписчиков).

Сначала создайте таблицу 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...