Ruby on Rails:基于新数据库条目创建链接

时间:2016-09-07 19:21:50

标签: ruby-on-rails ruby database model-view-controller

我正在更新我近两年前制作的网站。这是我的第一个真正的网站,我犯了一些错误(其他一些更严重)。

显然,我最大的一个是从视图中进行数据库调用。

我非常确定有更好的方法可以做到这一点:

使用案例

  1. 有人填写新主题的表单,填充主题表,并且已标记为"已注册",Subject.enrolled = 1
  2. 基于此,我现在需要在其他5个表(例如Baseline)中创建记录
  3. 从这里下坡,这是我的方法

    • 根据Subject(sub)

      中的subject_id确定记录是否存在
      <$ if Baseline.where(subject_id: sub.subject_id).first != nil $>
      
    • 如果不存在,请创建记录,(否则显示链接)

      <%= Baseline.create(subject_id: sub.subject_id) %>
      
  4. 这一切都发生在视图中,并创建一个前端表,其中包含指向进程中每条记录的链接。所以我基于for循环逻辑创建记录......

  5. 问题: 所以我正在寻找方向。我不想猜测如何做到这一点 - 我非常确定模型/控制器应该这样做 - 我想学习如何正确地做到这一点。如何根据表中的值自动创建记录?

    感谢您的时间。

1 个答案:

答案 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方法调用它。这两种方法都有利有弊。例如,滥用回调(任何地方)会降低代码的可读性,并且难以调试。另一方面,如果您恰好在其他地方编辑主题(但更明确),那么将这样的逻辑放在控制器中会给您带来负担,您必须记住调用它。无论你选择哪种方式,记住不要让你的课程太胖,例如尝试使用服务对象模式来分离这样的自定义逻辑,只要你觉得它已经失控。 :)不要忘记测试 - 当出现问题时,测试会使重构更容易。