Ruby on rails RubyonRails:基于新数据库条目创建链接
我在更新一个网站的过程中,我做了将近2年前。这是我第一个真正的网站,我犯了一些错误(有些比其他更严重) 显然,我最大的任务之一是从视图中调用数据库 我非常肯定有更好的方法: 用例: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确定记录是否存在 如果不存在,则创建记录(否则显示链接) 这一切都
- 根据subject(sub)的subject_id确定记录是否存在
- 如果不存在,则创建记录(否则显示链接)
谢谢您的时间。不太确定您的域和代码是什么样子,但要回答这个问题:“如何根据表中的值自动创建记录?”您似乎可以使用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