我有一个不同型号的应用程序。其中一个模型是通过成就与用户建立多对多关系的徽章模型。
在我的控制器中,我有一些逻辑来检查用户是否获得了成就,然后在关系表(成就)中进行插入。在控制器中进行一些硬编码后,我决定将逻辑带到 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
我的控制器中插入新用户的操作是:
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
但我有一个小问题,我需要控制器中的成就表(关系表)中最后插入的 id 以 JSON 格式返回。我的控制器中有许多其他功能需要接收更新或插入的 id。
如何在 postgresql 上捕获触发器的结果并在我的控制器中使用它们?我是否必须在我的控制器中进行查询以检索用户的最后成就,而不是从触发器接收它们?
谢谢你。