我的网站处理大量的药物剂量和单位。目前,根据用户的不同,将这些剂量和单位塑造成不同的值并不灵活。
例如,如果用户提交记录,他在星期一服用1毫升酒精,星期二服用10毫升,在星期二服用2滴,则同一物质使用两个分装单位。那么,如果我想向用户显示这三天的平均值仅以mL为单位会发生什么?如果用户希望只在Liters中看到它呢?
这是我到目前为止所拥有的。
drugs
id | drug
1 | alcohol
2 | cannabis
units
id | unit
1 | ml
2 | mg
3 | g
4 | l
unit_conversion
id | from_unitid | to_unitid | multiplier
1 | 1 | 4 | 1000
2 | 4 | 1 | .001
3 | 2 | 3 | 1000
4 | 3 | 2 | .001
user_dose_line
id | drug_id | unit_id | dose
1 | 1 | 1 | 100
2 | 1 | 1 | 200
3 | 1 | 4 | 1
以下是我的理想如何让它发挥作用。
用户提交记录。他说药物是酒精,剂量是100,单位是毫升。这个存储在数据库表中的是user_dose_line上的id#1。
现在让我们说还有另一张桌子。选项表是用户设置他想要使用的默认测量单位的。
user_dose_options
id | user_id | drug_id | unit_id
1 | 22 | 1 | 4
这表明用户已选择任何带有酒精的条目,应始终转换为升。
这是我的问题,在我的逻辑中我会进行这些转换。
我使用CAKEPHP,这是一个通常的MVC框架。我应该在模型中进行转换吗?在控制器?这是什么最好的做法。我是否为此选择了最优化的路线?
我计划稍后为单位/剂量添加更多功能,因此我需要以最有效的方式进行数据库设置,以便让我使用数据(显示图形,统计数据等)进行大量精彩计算
答案 0 :(得分:0)
您应该有输入和输出方法。那些应该从输入单元转换为用于存储数据的一个标准单元。 您可以在模型的setter中执行此操作。 即。
class userInTake {
private $userId;
private $drugId;
private $dose;
public function setDrugUse($drugId,$dose,$unitId) {
// $convert dose to you default unit for this drug
$this->dose = yourConversionMethod($dose,$unit,$desiredUnit);
$this->userId = $userId;
$this->drugId = $drugId;
}
...
}
在将用户输入存储到模型中时,您可以进行转换。 因此,例如,如果用户输入他在星期一服用4升酒精,则将升数转换为ml,然后存储ml值。 因此,如果一个用户三次出现,星期一4l,星期二40ml,星期五2,4l,你将每个输入转换为ml。 显示平均值时,您将获得6440ml。
您的输出功能可以选择最适合显示值的单位(即如果ml值> 10000,则显示为升)。
这样您就不必存储不同的单位,只需要您的单位进行输入/输出转换。这应该使计算变得更加容易。
答案 1 :(得分:0)
理想的设置是任何与数据相关的操作都应该在模型中。您可以覆盖afterFind()
方法,在查询后立即进行转换,并准备好使用数据。
http://book.cakephp.org/2.0/en/models/callback-methods.html#afterfind
记住这个理念:胖模特,瘦小的控制者。