ruby-on-rails - 插入或更新操作后在 Rails Controller 中捕获 postgres 触发器

标签 ruby-on-rails postgresql triggers controllers

我有一个具有不同模型的应用程序。其中一个模型是徽章模型,它通过成就与用户建立多对多关系。

在我的 Controller 中,我有一些逻辑来检查用户是否获得了成就,然后在关系表(成就)中插入。在 Controller 中进行一些硬编码后,我决定将逻辑用于 postgresql 中的触发器。

我已经为第一个徽章编写了触发器:

def change
execute <<-TRIGGER
CREATE OR REPLACE FUNCTION firstbadge() RETURNS trigger AS
$$
DECLARE
BEGIN
IF (select count(id) from User where facebookid=NEW.facebookid)==0 and (select count(id) from Achievement where user_id=NEW.id and badge_id=1)==0 then
    insert into Achievement(user_id,badge_id,created_at,updated_at)values(NEW.id,1,now(),now());
END IF;
RETURN NULL;
END;
$$ LANGUAGE plepgsql VOLATILE;
    DROP TRIGGER IF EXISTS add_badge_user ON paper;
    CREATE TRIGGER add_badge_user
    BEFORE INSERT ON User FOR EACH ROW
    EXECUTE PROCEDURE firstbadge();
TRIGGER
end

我的 Controller 中插入新用户的操作是:

if !params[:FirstName].blank? and !params[:LastName].blank?
      usuario = User.new
      usuario.facebookid=params[:FacebookId]
      usuario.facebooktoken=params[:FacebookToken]
      usuario.firstname=params[:FirstName]
      usuario.lastname=params[:LastName]
      usuario.identifier=params[:FirstName]
      usuario.age=params[:Age]
      usuario.email=params[:Email]
      usuario.level=0
      usuario.save
      json={:Authorize=> true}
      render :json => json, :status => 200
    end

但我有一个小问题,我需要从我的 Controller 中的成就表(关系表)中最后插入的 id 以 JSON 形式返回它。我的 Controller 中还有许多其他功能需要接收更新或插入的 ID。

如何在 postgresql 上捕获触发器的结果并在我的 Controller 中使用它们? 我是否必须在我的 Controller 中进行查询以检索用户的最后成就,而不是从触发器中接收它们?

谢谢。

最佳答案

简单地说:您正在采取一些远离 Rails 哲学的步骤。 Rails 是一个固执己见的框架,如果您不按照 Rails 的方式做事,就会受到伤害。

首先,Rails 社区普遍认为逻辑不应该属于数据库,它应该属于您的应用程序。关于这个有很多热烈的讨论,但是如果你打算使用 rails,你必须习惯它,因为框架就是这样设计的。因此,您应该在其中一个模型中使用回调,而不是触发器

除此之外,您的 Controller 代码似乎非常臃肿。鼓励保持 Controller 代码非常精简,因为它更易于维护并且与 MVC 体系结构一致( Controller 的职责应该只是实例化模型对象,对它们执行操作,然后实例化 View )。一种常见的做法是将此类逻辑下推到模型中。

此外,您似乎最不关心命名约定。如果你不遵循 Rails 的指导方针,你会失去很多神奇和奇迹,让你自己的生活变得更加艰难。例如,如果您遵循约定,则可以这样编写您发布的 Controller 代码:

  usario = User.new( params[:user] )
  usario.save
  render json: usario, status: 200

这是 3 行而不是 14 行。

最后,所有这些都表明对框架缺乏了解。我强烈建议您彻底(重新)阅读 rails guides ,可能还有许多好书中的一两本。这将使您对使用 rails 这个出色的工具的工作流程和设计有更准确的了解。

关于ruby-on-rails - 插入或更新操作后在 Rails Controller 中捕获 postgres 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15649120/

相关文章:

mysql - 创建触发器以在 MySQL 中的另一个表中插入新行时更新表

ruby-on-rails - Rails 根据 Rails 环境定义 root url

javascript - Rails Strong Params 无法识别通过 Ajax Post 发送的参数

ruby-on-rails - rails ajax 调用是否应该捆绑到它们自己的单独 Controller 中?

java - 将值从 java GUI 插入到 postgresql 数据库中

postgresql - 将分类器保存到 postrgesql 数据库,在 scikit-learn 中

ruby-on-rails - Rails : validations not enforced, 手动调用?

postgresql - 如何在 Postgresql 中优化行级安全性

javascript - doPost(e) 不会触发 onChange(e) - 在 Google 电子表格中触发更改事件

triggers - Windows 任务计划程序错误地为每个触发器生成多个实例(但需要能够并行运行多个实例)