我有一个具有不同模型的应用程序。其中一个模型是徽章模型,它通过成就与用户建立多对多关系。
在我的 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/