さまざまなモデルのアプリがあります。モデルの1つは、実績を介してユーザーと多対多の関係を持つバッジモデルです。
私のコントローラーには、ユーザーがアチーブメントを獲得したかどうかを確認してから、リレーションテーブル(アチーブメント)に挿入するロジックがあります。コントローラでハードコーディングした後、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
しかし、少し問題があります。JSONで返すには、コントローラーのAchievementテーブル(リレーションテーブル)から最後に挿入されたIDが必要です。また、私のコントローラーには、更新または挿入されたIDを受け取る必要のある他の多くの機能があります。
postgresqlでトリガーの結果をキャッチし、コントローラーで使用するにはどうすればよいですか?トリガーからユーザーの最後の成果を受け取るのではなく、コントローラーでクエリを実行して、ユーザーの最後の成果を取得する必要がありますか?
ありがとうございました。