2013-05-12 2 views
1

У меня есть модель User, которая используется для хранения всех пользователей. В моих приложениях, наставниках и учениках есть два типа пользователей, но они имеют одинаковую структуру.Rails динамический внешний ключ для отношений has_many

Я хочу сделать что-то вроде этого.

has_many :requests, :foreign_key => mentor? ? 'mentor_id' : 'student_id', :class_name => 'Request' 

У меня есть наставник? метод в модели, но он дает мне ошибку method_missing. Я предполагаю, что это потому, что он ищет метод в dynamic_matchers.rb

Это ошибка дает

/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/dynamic_matchers.rb:55:in 'method_missing': undefined method 'mentor?' for #<Class:0x00000001b40630> (NoMethodError)

Есть ли способ пойти об этом, не делая отдельную модель для студентов и Mentor ? Я чувствую, что было бы лишним, если бы они использовали одни и те же поля.

+0

Почему вы хотите различные столбцы идентификаторов? Эта логика должна быть только в пользовательской модели, а не на запросах. И то, что вы хотите, невозможно ...: D – jokklan

ответ

5

Ok так что позвольте мне исправить это: это не представляется возможным, и даже если в утопическом мире это было или вы нашли Обходной путь для этого, конечно, не верный.

Что вы на самом деле ищет представляет собой сочетание между наследования (ИППП или одним столом Наследование в Rails) и полиморфизма.

Как вы можете реализовать это правильно?

У вас есть пользователя модели, Студентов и Наставниками ара как пользователей так они оба унаследует для этой модели.

class User < ActiveRecord::Base 
end 

class Student < User 
end 

class Mentor < User 
end 

Что это означает? Ну это означает, что модель пользователя имеет место (без вас делать что-либо еще) поле типа которым будет содержать либо «Студент» или «Ментор» или ничего в зависимости от того, как инициализировать объект:

user = User.create() 
student = Student.create() 
mentor = Mentor.create() 

Теперь, ваш Запрос может принадлежать Студент или Наставник.Таким образом, здесь вы можете установить полиморфные ассоциации вроде так:

class Student < User 
    has_many :requests, as: :owner 
end 

class Mentor < User 
    has_many :requests, as: :owner 
end 

class Request < ActiveRecord::Base 
    belongs_to :owner, polymorphic: true 
end 

Теперь вы можете написать:

student.requests 
mentor.requests 
request.owner 
+0

Запрос принадлежит как наставнику, так и ученику. Как мне это сделать? Как Rails знает, является ли это учеником или наставником? – Anujan

+0

Я просто наследул однонаправленное наследование, спасибо большое за вашу помощь! :) – Anujan

+1

Добро пожаловать:) – Raindal

1

Я не совсем уверен, что вам нужно. Такая же структура модели, и один пользователь может стать наставником для многих студентов? и у одного ученика может быть один наставник? в том, что?

если есть, что с собой присоединиться?

class User < ActiveRecord::Base 
    has_many :students, :class_name => "User", :foreign_key => "mentor_id" 
    belongs_to :mentor, :class_name => "User" 
end 

таким образом, вы будете иметь возможность вызывать student.mentor и mentor.students

+0

У меня есть отношения ученика-наставника в другой модели, так как у наставников может быть несколько учеников. – Anujan

+0

но способ, которым я отправил, у вас также может быть несколько учеников, связанных с одним наставником =) –

+0

Извините за беспокойство !, Спарда уже ответил, и я не видел его в поиске тегов. –

Смежные вопросы