rails has_and_belongs_to_many или ручная реализация - PullRequest
0 голосов
/ 01 августа 2010

Я разрабатываю приложение ruby ​​on rails для аптеки, и одной из особенностей является то, что есть магазины, в которых работают фармацевты.Кроме того, есть фармацевты, которые могут работать во многих магазинах.Это звучит как работа для HABTM, верно?Ну, будучи новичком, я вручную разработал обходной путь (потому что я никогда не слышал о HABTM - я в основном учил себя рельсам и никогда не достигал некоторых более продвинутых отношений).Прямо сейчас, когда фармацевт сохраняется, в действии создания и обновления контроллера фармацевтов есть пара строк, которые превращают магазины, в которых они работают, в строку, причем каждый store_id отделяется запятой.Затем, когда отображается хранилище, оно выполняет запрос MYSQL @pharmacists = Pharmacist.find :all, :conditions => "stores REGEXP '#{@store.id}'"

. Будет ли перенос этой системы в систему HABTM на основе рельсов более эффективным?Конечно, в конечном итоге потребуется меньше кода, но стоит ли это того?Другими словами, какие преимущества, кроме меньшего количества кода, я бы получил от перемещения этой ассоциации под управление rails?

1 Ответ

1 голос
/ 01 августа 2010

Преимущество заключается в том, что вы будете использовать правильный инструмент для работы!Смысл использования фреймворка, такого как Rails, состоит в том, что он помогает вам решать общие проблемы без необходимости заново изобретать колесо, что вы и сделали.Используя ассоциации, вы также будете правильно использовать реляционную базу данных и сможете воспользоваться такими преимуществами, как индексация внешнего ключа, которая будет быстрее, чем манипулирование строками.

Вы должны использовать отношение has_and_belongs_to_many, если вам не нужнохранить дополнительные атрибуты в модели соединения (например, дату, когда фармацевт начал работать в магазине); в этом случае используйте has_many :through.

Использование ассоциаций Rails предоставит вам все удобные методы, которые предоставляет Rails, такие какэто:

# Find the stores the first pharmacist works at
@stores = Pharmacist.first.stores

# Find the pharmacists who work at a store
@pharmacists = Store.find_by_name('A Store').pharmacists
...