Во время работы над приложением Ruby on Rails мой коллега предложил мне намеренно опустить ассоциацию ActiveRecord, поскольку она определяет ненужные методы.
Пример,
class Person < ActiveRecord::Base
has_many :pets
end
class Pet < ActiveRecord::Base
# belongs_to :person <- Omit belongs_to association, for this is not used in anywhere.
end
Меня смущает этот совет, потому что предлагается полностью определить ассоциации моделей на большинстве ресурсов, описывающих ассоциацию ActiveRecord. Итак, я хотел бы спросить, действительна ли практика исключения таких ассоциаций.
Спасибо за комментарий. Я думаю, что это верно, но не самое лучшее. Поэтому мне трудно иметь дело с такого рода советами.
Согласно Двунаправленные ассоциации из Rails Guide, если вы укажете отношение в обеих моделях:
Active Record попытается автоматически определить, что эти две модели имеют двунаправленную ассоциацию на основе имени ассоциации. Эта информация позволяет Active Record:
- Предотвратите ненужные запросы к уже загруженным данным.
- Предотвратите противоречивые данные.
- Автосохранение ассоциаций в большем количестве случаев.
- Подтвердите наличие и отсутствие ассоциаций в большем количестве случаев.
Поэтому это считается лучшей практикой. Также вы сможете использовать методы и опции, предоставленные belongs_to
.
Однако не обязательно добавлять их оба: вы можете использовать одностороннее отношение, если оно соответствует вашим потребностям.
«действительная практика»: Да, вы можете легко определить это, основываясь на том факте, что приложение и модели успешно функционируют без указания ассоциации. «лучшая практика»: высказывает свое мнение, но я думаю, что в большинстве случаев ответ — нет. Если я могу вызвать
person.pets
, то общее предположение состоит в том, что я также могу вызватьpet.person
, и было бы удивительно узнать, что этот метод не существует; однако легко решаемая.