Взаимосвязь моделей активной записи Rails - одна модель, принадлежащая трем моделям - PullRequest
0 голосов
/ 05 января 2011

У меня есть ситуация, когда у одной модели должно быть три иностранных идентификатора.Эта таблица содержит информацию, относящуюся к трем моделям.

Например, - три модели - клавиатура, мышь, монитор Теперь у меня есть подробности четвертой модели - в которой содержится информация о том, что произойдет для любой комбинации, такой как клавиатура1, мышь1 и монитор1.

Итак, какой должен быть хороший шаблон дизайна для этого?

Прямо сейчас я использую Detail.find_by_keyboard_id_and_mouse_id_and_mitor_id (клавиатура1id, mouse1id, monitor1id) # => Detail1

КакойКонечно, это не лучший способ ...

1 Ответ

1 голос
/ 05 января 2011

Я не думаю, что у вас плохой дизайн. Вероятно, не так уж много вариантов того, как это должно быть реализовано, но вы должны подумать о том, как вы хотите его использовать. Лично я бы не назвал модель Деталь , поскольку она ничего не говорит вам о том, что на самом деле модель. Что-то вроде HardwareConfiguration является более явным. Может быть, слишком долго, но вы можете сократить его до HardwareConfig или Configuration, в зависимости от вашего вкуса.

Эта модель должна иметь идентификатор и три внешних ключа. Также следует добавить индексы базы данных к каждому полю внешнего ключа.

class Detail < ActiveRecord::Base
  belongs_to :keyboard
  belongs_to :mouse
  belongs_to :monitor
end

Тогда каждая аппаратная модель будет иметь _many: подробности вроде:

class Keyboard < ActiveRecord::Base
  has_many :details
end

Вы можете посмотреть подробный комбо по его идентификатору или любой комбинации внешних ключей.

Detail.find(id)
Detail.find_all_by_keyboard_id(keyboard_id)
...