Использование модели соединения для связи модели с самим собой - PullRequest
2 голосов
/ 19 мая 2010

У меня есть две модели:

  • Пользователь
  • MentoringRelationship

MentoringRelationship - это модель соединения, в которой есть столбец mentor_id и столбец mentee_id (оба они ссылаются на user_ids из таблицы users).

Как я могу указать отношение, называемое 'mentees', в классе User, которое будет возвращать всех пользователей, на которых обучается этот пользователь, используя таблицу соединения MentoringRelationships? Какие отношения нам нужно объявить в модели User и в модели MentoringRelationship?

Ответы [ 4 ]

2 голосов
/ 19 мая 2010

Вне моей головы, ссылаясь на API документы :

class User < AR::B
  has_many :mentees, :through => :mentoring_relationship
  has_many :mentors, :through => :mentoring_relationship
end

class MentoringRelationship < AR::B
  belongs_to :mentee, :class_name => "User"
  belongs_to :mentor, :class_name => "User"
end

Не проверено, но, похоже, это должно работать.

0 голосов
/ 20 мая 2010

Благодаря http://blog.hasmanythrough.com/2007/10/30/self-referential-has-many-through, я смог собрать что-то, что работает.

в приложении / models / user.rb

  has_many :mentee_relationships, :class_name => 'MentoringRelationship', :foreign_key => :mentor_id
  has_many :mentees, :through => :mentee_relationships, :source => :mentee, :foreign_key => :mentor_id

  has_many :mentor_relationships, :class_name => 'MentoringRelationship', :foreign_key => :mentee_id
  has_one :mentor, :through => :mentor_relationships, :source => :mentor, :foreign_key => :mentee_id

в приложении / models / mentoring_relationship.rb

  belongs_to :mentee, :class_name => "User"
  belongs_to :mentor, :class_name => "User"
0 голосов
/ 19 мая 2010

Я считаю, что это работает ...

class User < ActiveRecord::Base
   has_many :mentees, :foreign_key => :mentee_id, 
      :class_name => "MentoringRelationship"

   has_many :mentors, :foreign_key => :mentor_id,
      :class_name => "MentoringRelationship"
end

class MentoringRelationship < ActiveRecord::Base
   belongs_to :mentee, :class_name => "User"
   belongs_to :mentor, :class_name => "User"   
end

С этим кодом вы можете использовать

@user = User.find(:first)
@user.mentees
@user.mentors
0 голосов
/ 19 мая 2010

Вы можете сделать это, используя следующие способы. В user.rb

def mentees
 user = User.find_by_sql("select u.* from the users u, mentoring_relationships m where m.mentor_id = #{self.id} and u.id = m.mentee_id")
end

In controller

@user.mentees >> all of the users mentored by @user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...