2010-08-01 2 views
0

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

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

ответ

1

Выгода заключается в том, что вы будете использовать подходящий инструмент для работы! Весь смысл использования такой структуры, как 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 
+0

Спасибо! Я реализовал его, и это было так просто - потребовалось около 1/5 кода, который я использовал раньше, и был значительно проще, чем я ожидал. Те методы, которые приходят вместе с отношениями has_and_belongs_to_many, окажутся полезными в будущих проектах и ​​далее в будущем с этим проектом. –

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