Несколько уровней have_many в модели

#ruby-on-rails #ruby #activerecord #has-many-through

#ruby-on-rails #ruby #activerecord #имеет много сквозных

Вопрос:

Я работаю с Ruby on Rails (в частности, с ActiveRecord) и пытаюсь решить, является ли хорошей идеей связывать мои модели с использованием нескольких уровней.

 class Student < ActiveRecord::Base
  has_many :student_sections
  has_many :sections, :through => :student_sections
  has_many :courses, :through => :sections
end
  

Кажется, что это сработало бы, но у меня нет большого опыта в ActiveRecord. Есть ли какая-либо причина не делать этого?

Ответ №1:

Это нормально, но вы должны иметь в виду, что ассоциация courses фактически является только ассоциацией ‘get’ (в отличие от ‘get и set’). Я имею в виду, что вы можете сказать

@student.courses

(после исправления neo), чтобы получить список курсов, но вы не можете сделать

@student.courses << @курс

поскольку в rails нет информации о разделе, необходимой для выполнения необходимых соединений между студентом и курсом.

Ответ №2:

вам нужно добавить:атрибут источника

 has_many :sections, :through => :student_sections, :source => 'your_source'
  

Комментарии:

1. Зачем ему нужно добавлять исходный код? В этом случае Rails должен иметь возможность автоматически определять ассоциацию.

2. в rdoc написано: «Указывает имя исходной ассоциации, используемое has_many : через запросы. Используйте это только в том случае, если имя не может быть выведено из ассоциации. has_many :subscribers, :through => :subscriptions будут искать либо :subscribers, либо :subscriber при подписке, если не указан :source.»

3. Моя модель настроена так, что мне не нужно использовать:source, но спасибо.