1

さまざまなモデルのアプリがあります。モデルの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でトリガーの結果をキャッチし、コントローラーで使用するにはどうすればよいですか?トリガーからユーザーの最後の成果を受け取るのではなく、コントローラーでクエリを実行して、ユーザーの最後の成果を取得する必要がありますか?

ありがとうございました。

4

1 に答える 1

0

簡単に言えば、あなたはレールの哲学からいくつかの一歩を踏み出しているのです。Railsは独創的なフレームワークであり、Railsの方法に従って行動しないと、問題が発生します。

まず第一に、ロジックはデータベースに属するべきではなく、アプリケーションに属するべきであることがRailsコミュニティで一般的に受け入れられています。これについては多くの熱狂的な話がありますが、レールを使用する場合は、フレームワークがそのように設計されているため、それに慣れる必要があります。したがって、トリガーの代わりに、モデルの1つでコールバックを使用する必要があります

それ以外は、コントローラーコードが非常に肥大化しているようです。コントローラーコードは、MVCアーキテクチャーとの保守性と一貫性がはるかに高いため、非常に薄くすることをお勧めします(コントローラーの責任は、モデルオブジェクトをインスタンス化し、それらに対してアクションを実行してから、ビューをインスタンス化することだけです)。一般的な方法は、そのようなロジックをモデルにプッシュダウンすることです。

さらに、命名規則についてはあまり気にしないようです。これに関するレールのガイドラインに従わないと、多くの魔法と不思議を失い、自分の人生をより困難にします。たとえば、規則に従っている場合は、次のように投稿したコントローラーコードを記述できます。

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

これは14行ではなく3行です。

最後に、これはすべて、フレームワークに関する知識が不足していることを示しています。レールガイドを完全に(再)読むことを強くお勧めします。おそらく、そこにある多くの優れた本の1つか2つを読んでください。これにより、レールであるこのすばらしいツールを使用して、ワークフローと設計のより正確なアイデアが得られます。

于 2013-03-27T10:55:26.043 に答える