2010-08-01 37 views
0

我正在为一家药店的Rails应用程序设计一款红宝石,其中一个特点是有店里有药剂师在那里工作。另外,还有药剂师,他们可以在很多商店工作。这听起来像是HABTM的工作,对吧?那么,作为新手,我手动设计了一种解决方法(因为我从来没有听说过HABTM--我基本上就是在教自己的铁轨,从来没有去过一些更高级的关系)。现在,当药剂师被保存时,药师控制器的创建和更新操作中会有几行代码将它们工作的商店变成一个字符串,每个store_id用逗号分隔。然后,当显示商店时,它通过 @pharmacists = Pharmacist.find :all, :conditions => "stores REGEXP '#{@store.id}'"rails has_and_belongs_to_many或手动执行

执行MYSQL请求将该系统转移到基于轨道的HABTM系统会更高效吗?当然,最终需要更少的代码,但它会值得吗?换句话说,除了代码少之外,我可以通过移动这个关联来获得由rails管理的好处吗?

回答

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关系一起出现的方法在未来的项目中将会非常有用,并且会在这个项目中继续前进。 – 2010-08-02 03:04:30