2013-12-05 10 views
3

Я понимаю концепцию реляционных баз данных, первичных/внешних ключей и т. Д. Однако мне не удается увидеть фактический результат настройки этих свойств в моих моделях. Создают ли они вспомогательные функции или что-то подобное? или они просто работают на уровне базы данных?В Rails, что делают ключевые слова belongs_to, has_many и т. Д., На самом деле?

Например, если у меня есть эти две модели (другие свойства опущены)

class Course < ActiveRecord::Base 
    has_and_belongs_to_many :schedules 
    has_many :sections 
end 

class Section < ActiveRecord::Base 
    belongs_to :course 
end 

я мог бы просто получить все разделы для любого данного курса, как это:

Section.where(course_id: 1234) 

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

+2

Таким образом, вы можете получить учебные курсы. –

+0

Они метапрограммируют магические вещи сахара. В принципе, Rails позволяет использовать все виды других методов экземпляра для модели, связанной с ассоциациями моделей, когда вы просто пишете 'принадлежит_то: курс'. –

+0

Спасибо всем! Раньше я вручную определял методы, такие как @ course.sections, хотя они уже генерировались отношениями :) – flyingtoaster0

ответ

3

Добавление этих методов позволяет вам делать такие вещи, как это:

Section.find(5).course # <== returns a 'Course' model instance 

Также давайте вы присоединитесь ваши запросы более легко:

Section.joins(:course).where(course: {name: "English"}) # <== returns sections who have the 'english' course 

Ни один из них было бы возможно, если вы не установили вверх по отношениям в модели.

Аналогично:

Course.find(8).sections # returns an array of sections with 'course_id = 8' 

Это делает ваши звонки более семантическими, и делает вещи проще с точки зрения программного :)

+0

Он также обрабатывает аспекты базы данных, настраивая ключи и объединяя таблицы по мере необходимости. – jm0

+1

Хм. Определение 'has_many' в модели само по себе ничего не делает для базы данных. Вам все еще нужна миграция, которая создает внешний ключ 'course_id' на таблице' sections' - и то же самое для любой таблицы соединений.Я полагаю, что если вы используете один из генераторов моделей для этого, вы можете получить это бесплатно, но я никогда не пытался заставить один из генераторов автоматически настраивать ассоциации для меня. Большинство из них я использовал для создания исходного набора свойств. – nzifnab

+0

да, вам нужны миграции, чтобы коснуться БД, конечно - http://guides.rubyonrails.org/association_basics.html – jm0

2

отношения применяются на экземплярах объекта. Таким образом, эти отношения позволяют вам связать объекты с экземпляром другого.

Например, скажем, у вас есть экземпляр Section (так называемый @section). Вы можете получить все объекты Course для этого раздела:

@section.course если у вас есть belongs_to :course настроен.

Точно так же, если у вас есть экземпляр Course, вы можете получить все Section объекты для этого Course с:

@course.sections, если у вас есть has_many :sections.

TL; DR - это вспомогательные прицелы для переменных экземпляра Course и Section.

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

  • Нет связанных вопросов^_^