Cześć.
Mam następujące modele
[code]class SchoolClass < ActiveRecord::Base
has_many :students
end
class Student < User
belongs_to :school_class
belongs_to :teacher
end
class Teacher < User
has_many :students
end[/code]
Czy istnieje jakaś wbudowana metoda która ustawi teacher_id dla @student?
@student = @teacher.school_classes.first.students.build(params[:student])
@student.teacher_id == @teacher.school_classes.first.teacher_id # => true
Wiem, że mogę ustawić before_validation callback, ale może istnieje wbudowane rozwiązanie?
Jeśli dobrze rozumiem Twój problem, to chodzi Ci o relacje przechodnią - nauczycielem studenta jest nauczyciel jego klasy. Wtedy możesz skorzystać z has_many :through.
has_many :through w połowie rozwiązuje mój problem.
Teacher.first.students zwraca studentów biorąc ich z klas, tak jak chciałem ;).
Teraz potrzebuje pomocy w drugą stronę.
Student.first.teacher zwraca nil,a chciałbym, żeby zwracało rekord nauczyciela.
Pytanie co będzie lepszym rozwiązaniem?
- metoda dla modelu student
def teacher
school_class.teacher
end
2) before_validation callback dla modelu student
before_validation :inherit_from_teacher
def inheirt_from_teacher
self.teacher_id = self.school_class.teacher_id
end
ja bym został przy tym opcji pierwszej, natomiast jeśli chodzi o implementację to jest taka fajna metoda delegate
delegate :teacher, :to => :school_class