Ссылки на другие данные из других моделей

Мне нужна помощь в отношении извлечения данных из других моделей и правильной помощи по ссылкам в Rails. Например, у меня есть приложение Rails, в котором хранится информация о гонках. Здесь у меня есть автомобили, класс автомобилей, события и гонки. У меня есть это, где я могу создать автомобиль, который является частью класса автомобилей, однако я не знаю, как бы я сделал часть событий и гонок. Я надеюсь, что все это имеет смысл, поскольку я все еще пытаюсь понять это сам. Я использую версию Rails 4.1.6.

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

Класс автомобиля. Это класс, к которому принадлежит автомобиль. Все машины должны быть одного класса. Это должно содержать всю информацию о классе автомобиля.

Модель:

class CarClass < ActiveRecord::Base
  has_many :cars
end

Автомобили. Автомобили относятся к одному классу, как видно из моделей CarClass и Car. Это должно содержать все детали об автомобилях.

Модель:

class Car < ActiveRecord::Base
      belongs_to :car_class
 end

Событие. Мероприятие – это соревнование, в котором участвует автомобиль определенного класса. Он будет содержать сведения о событии, однако сведения о классе и автомобиле будут храниться CarClass и Car, как указано выше. Должна быть возможность получить список всех автомобилей для мероприятия. Я предполагаю, что у Event будет много Racing.


Гонки Здесь должны храниться статистические данные о гонках для каждой машины. Например, куда они пришли, отследить время и т. д. Я предполагаю, что Racing будет принадлежать Event.


person Seldon Stone    schedule 26.01.2015    source источник
comment
class Car ‹ ActiveRecord::Base created_to :cars конец не может принадлежать самому себе   -  person neo    schedule 27.01.2015
comment
Спасибо за помощь, Нео, я исправил проблему.   -  person Seldon Stone    schedule 27.01.2015


Ответы (1)


Это довольно классическая has_many through: ситуация. Это отношение «многие ко многим» между двумя моделями с промежуточной моделью, выступающей в качестве таблицы соединения. Использование здесь отдельной модели для таблицы соединения позволит вам хранить дополнительные данные для гонок, а не только связь между автомобилями и событиями.

Вы можете сделать следующее:

class Racing < AR::Base
  belongs_to :car
  belongs_to :event
end

class Event < AR::Base
  has_many :racings
  has_many :cars, through: :racings
end

class Car < AR::Base
  has_many :racings
  has_many :events, through: :racings

  belongs_to :car_class 
end

class CarClass < AR::Base
  has_many :cars
end

Подробнее об ассоциациях Rails можно прочитать в руководствах. .

Это позволит вам получить доступ к событиям из автомобилей и наоборот. Также таким образом вы можете добраться до классов автомобилей из события. Например, класс первого автомобиля первого события:

Event.first.cars.first.car_class

Когда вы перебираете ассоциации, не забудьте использовать includes там, где это уместно.

person tmichel    schedule 26.01.2015
comment
Как Car Class будет играть в этом? Я предполагаю, что машина все еще belongs_to car_class верно? - person Seldon Stone; 27.01.2015
comment
Я уверен, что это, вероятно, правильно, поэтому я собираюсь отметить это как ответ. Вы знаете, как бы я сделал форму события для этого? Например, если я выбираю класс автомобиля для события, я бы хотел, чтобы все автомобили этого класса добавлялись в racing и отображались в этом событии. Прямо сейчас я могу думать только о том, чтобы сделать for @cars.each, а затем перебрать все автомобили в этом классе и каким-то образом добавить их одну за другой ... но мне это не кажется правильным. Это похоже на еще один вопрос ... дайте мне знать, если я должен создать его. - person Seldon Stone; 29.01.2015
comment
Да это наверное отдельный вопрос. Когда вы создаете событие, вы можете просто сделать event.cars << car_class.cars. См.: api.rubyonrails.org/classes/ ActiveRecord/Ассоциации/ - person tmichel; 29.01.2015