我有一个rails多态模型“Task”。将有许多具有“任务”的不同模型。现在我有一个模型“患者”,我需要为每个患者提取分配给他们的任务,将它们放在每个患者索引页面上,然后使用角度处理该页面内任务的粗略动作。这是我一直在进行的内部斗争。我可以看到两种截然不同的方式,我不确定哪种方式被认为是最佳设计实践:
将会有许多具有任务的rails对象,因此任务应该保留所有逻辑,并解释对象要求执行的任务。会有一个角度的TasksController,它将通过您所在的页面知道,您正在处理的“任务”对象是什么。然后,它将查询tasks_controller以提取与该可任务对象相关的所有任务。对于每个crud操作,任务对象和资源将处理数据。
每个对象(在本例中为每个患者)通过关联(patient.tasks)知道它具有哪些任务,因此逻辑应该流经任务对象。在角度中,将有一个PatientController将找到当前患者,然后在rails中查询patients_controller,并返回分配给该患者的相关任务。对于每个crud操作,患者对象和资源将处理数据。
现在我已经选择了1.这是我的TasksController.js:
BC.controller('TasksController', ['$scope', 'TaskResource', function($scope, TaskResource){
$scope.init = function(taskableId, taskableType, currentUserId) {
$scope.task = {};
$scope.task.taskableId = taskableId;
$scope.task.taskableType = taskableType;
$scope.task.creatorId = currentUserId;
TaskResource.query({taskable_id: $scope.task.taskableId, taskable_type: $scope.task.taskableType}).then(function(result){
$scope.tasks = result.reverse();
});
};
$scope.taskCreate = function($event, task){
$event.preventDefault();
new TaskResource({text: task.text, taskableType: task.taskableType, taskableId: task.taskableId, creatorId: task.creatorId})
.create().then(function(result){
$scope.tasks.unshift(result);
$scope.task.text = '';
});
};
}]);
我有一个init函数,我传递了我所在页面的taskable_id和taskable_type,以便从tasks_controller和Task模型中查询正确的任务。这目前正在工作,但我开始看到一些可能的设计问题,并且不禁觉得这可能是一个糟糕的设计实践。任何有关这方面的帮助/想法将不胜感激。谢谢。
答案 0 :(得分:2)
简短的回答,第一个选项符合'标准练习',是更好的选择。最佳实践始于如何您实施此标准实践 - 或前端 - 后端应用程序中出现的标准需求
选择相当于降低成本并在未来轻松改变的解决方案
一旦确定了标准做法 - 如何最好地安排Angular< =>的通信。 Rails,寻求最佳实践,应该如何开始。有许多方法可以采取。 Restangular,角度低级别$http,角度级别ngResource或特定于Rails的方法 - angularjs-rails-resource。这些都有效,还有更多。
但你正在使用其中之一,这不是你的问题。这里要问的一个微妙的问题不是这些方法应该用什么方法来谈,而是他们应该以什么方式交谈。这种情况下的最佳实践实际上是由一系列指导而非规则决定的。这些指导方针规定,最佳解决方案可能对您自己的应用程序而言有些独特,而且所有这些都是为了充分利用您所选择的每项选择的成本。
问题是在应用程序的早期阶段,我们从未真正了解实际成本。作为桑迪梅斯“你永远不会知道你现在做的事情”。所以,我建议在开始阶段,任何时候你面临这样的决定,做最多利用你的API。而不是在Angularjs中做任何形式的想法,将数据传递给Rails API并让它弄清楚。在这个级别,您将需要使用疼痛驱动的开发 - 聆听应用程序的痛苦。当事情变得艰难时,退后一步,看看是什么导致疼痛。听听痛苦。当出现问题时,它会告诉你。
使用SOLID原则构建公共接口
这个概念从SOLID面向对象设计中茁壮成长。它的要点是制作易于更改的应用程序的指南,以Angular所说的方式运行*“Hello Rails API,我知道你有我想要的东西,我相信你会把它归还给我”而不是说*“Hello Rails,我知道你有我想要的东西,我知道你需要怎样才能得到它”哪个只比最坏的情况好一点,“你好,Rails先生。我知道你有我想要的,我知道什么我想,我知道如何得到它。“
Sandi Metz在她的“Ruby中的实用面向对象设计”一书中对此进行了最佳解释。第4章很好地解释了它。在该章中,您处理对象的公共接口(API),并且在此问题中您指的是 Rails 应用程序的实际公共接口(API),一旦你看过Rails应用程序的表面层,你最终会处理一个对象接口,因为最后你可能最终会在你的控制器中调用一个方法, 对象适用公共接口。
代码比单词更响亮,如果其中一些没有意义,发布更多代码,我们可以尝试在代码中解释这个,这比单词更容易理解:)
修改:我打算再次解决这个问题,看看我是否无法以更易于理解的方式对其进行重组