Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:基于新数据库条目创建链接_Ruby On Rails_Ruby_Database_Model View Controller - Fatal编程技术网

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

Ruby on rails RubyonRails:基于新数据库条目创建链接,ruby-on-rails,ruby,database,model-view-controller,Ruby On Rails,Ruby,Database,Model View Controller,我在更新一个网站的过程中,我做了将近2年前。这是我第一个真正的网站,我犯了一些错误(有些比其他更严重) 显然,我最大的任务之一是从视图中调用数据库 我非常肯定有更好的方法: 用例: 有人填写了新主题的表格,填充了主题表,他们被标记为“已注册”,subject.registered=1 基于此,我现在需要在其他5个表(例如基线)中创建一个记录 从这里往下走,这是我的方法 根据subject(sub)的subject_id确定记录是否存在 如果不存在,则创建记录(否则显示链接) 这一切都

我在更新一个网站的过程中,我做了将近2年前。这是我第一个真正的网站,我犯了一些错误(有些比其他更严重)

显然,我最大的任务之一是从视图中调用数据库

我非常肯定有更好的方法:

用例:

  • 有人填写了新主题的表格,填充了主题表,他们被标记为“已注册”,subject.registered=1
  • 基于此,我现在需要在其他5个表(例如基线)中创建一个记录
  • 从这里往下走,这是我的方法

    • 根据subject(sub)的subject_id确定记录是否存在

      
      
    • 如果不存在,则创建记录(否则显示链接)

      
      
  • 这一切都发生在视图中,并创建一个前端表,其中包含指向流程中每条记录的链接。所以我正在基于for循环逻辑创建记录

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


    谢谢您的时间。

    不太确定您的域和代码是什么样子,但要回答这个问题:“如何根据表中的值自动创建记录?”您似乎可以使用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方法调用它。这两种方法都有利弊。例如,滥用回调(随处可见)会降低代码的可读性和调试难度。另一方面,在控制器中放入这样的逻辑会给您带来负担,如果您碰巧在其他地方编辑主题,您必须记住调用它(但更明确)。无论您选择哪种方式,请记住不要使您的类太过臃肿,例如,一旦您感觉自定义逻辑失控,请尝试使用服务对象模式来分离此类自定义逻辑。:)不要忘记测试——当出现问题时,测试会使重构更容易。

    我想知道表单对象是否是您可以使用的:这看起来像是我应该做的。。。保存后什么时候会被呼叫?受试者可以作为空白值注册一段时间,然后在将来的任何时候将其更改为1。我发现了一个after_update函数,也许这就是我应该使用的?事实上,我认为after_commit回调更适合您的用例:我已经更新了代码,告诉您如何确保在创建和更新时执行它。我明白了。我认为你的答案是正确的,我认为这让我走上了正确的道路。不过还有一个问题,这应该放在模型或控制器中吗?我原以为该模型适用于这样的数据库,但是:create和:update是控制器的特性。谢谢你的帮助!
    <%= Baseline.create(subject_id: sub.subject_id) %>
    
    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