我正在更新我近两年前制作的网站。这是我的第一个真正的网站,我犯了一些错误(其他一些更严重)。
显然,我最大的一个是从视图中进行数据库调用。
我非常确定有更好的方法可以做到这一点:
使用案例
从这里下坡,这是我的方法
根据Subject(sub)
中的subject_id确定记录是否存在<$ if Baseline.where(subject_id: sub.subject_id).first != nil $>
如果不存在,请创建记录,(否则显示链接)
<%= Baseline.create(subject_id: sub.subject_id) %>
这一切都发生在视图中,并创建一个前端表,其中包含指向进程中每条记录的链接。所以我基于for循环逻辑创建记录......
问题: 所以我正在寻找方向。我不想猜测如何做到这一点 - 我非常确定模型/控制器应该这样做 - 我想学习如何正确地做到这一点。如何根据表中的值自动创建记录?
感谢您的时间。
答案 0 :(得分:1)
不太确定您的域名和代码是什么样的,但要回答这个问题:'我如何根据表中的值自动创建记录?',似乎您可以使用ActiveRecord回调,如下所示:
class Subject < ActiveRecord::Base
after_commit :create_baseline_if_enrolled, on: [:create, :update]
private
def create_baseline_if_enrolled
return unless enrolled?
# enrolled? == true, you may create these models here
end
end
回答你的问题: 这取决于:)这只是一种可能的解决方案。另一种方法是将这样的自定义逻辑放在SubjectsController中,并直接从#create,#update方法调用它。这两种方法都有利有弊。例如,滥用回调(任何地方)会降低代码的可读性,并且难以调试。另一方面,如果您恰好在其他地方编辑主题(但更明确),那么将这样的逻辑放在控制器中会给您带来负担,您必须记住调用它。无论你选择哪种方式,记住不要让你的课程太胖,例如尝试使用服务对象模式来分离这样的自定义逻辑,只要你觉得它已经失控。 :)不要忘记测试 - 当出现问题时,测试会使重构更容易。