0

通常は破棄される古い記録を保管したい。たとえば、ユーザーがプロジェクトに参加し、後でそこから追い出されたとします。レコードを非アクティブとしてフラグを立てる何かで user_project レコードを保持したいと思います。このために、各モデルで状態属性を使用して、各レコードの現在の状態を定義します。

ほとんどすべての「クエリ」は、「アクティブな」レコード、状態 == 1 のレコードのみを必要とし、ActiveRecord ヘルパー (find_by など) を使用したいと考えています。すべての「find_by」に追加したくないので、「_and_state」を使用して、アクティブなレコードのみを検索します。

これは私が今持っているものです:

u = UserProject.find_by_user_id_and_project_id id1, id2

これは、すべてのモデルについて、このようなすべてのクエリに対して私が持つものです:

u = UserProject.find_by_user_id_and_project_id_and_state id1, id2, 1

これを実装するための最もクリーンな方法は何ですか (状態の維持とよりクリーンなクエリ コード)?

4

3 に答える 3

1

以下は、選択したいソフト削除ジェムの範囲です。これらは、すでに熟考され、デバッグされている優れた抽象化を提供します。

ただし、これがたまたま初めての Rails アプリである場合は、独自の実装を展開するという Martin のアドバイスを支持します。

于 2013-06-27T14:06:34.320 に答える
1

これをマーティンの回答に追加しようとしましたが、編集を確認する必要があるため、マーティンの回答は素晴らしかったですが、デフォルトのスコープのアイデアで少し改善できます。デフォルトのスコープを明確にオフにしない限り、デフォルトのスコープは、ファインダーを追加するモデルのファインダーに常に適用されます。

class UserProject < ActiveRecord::Base
  default_scope where(:state => 1)
end

マーティンが示した例は次のようになります。

u = UserProject.find_by_user_id_and_project_id id1, id2

この場合、state == 1 を指定しなくても、アクティブなレコードのみが取得されます。ほとんどの場合、これが必要な場合は、既定のスコープを使用すると、コードのどこかで誤って '.active' を除外してしまい、見つけにくいバグが発生する可能性がなくなります。

次のようにデフォルトのスコープを指定した場合:

default_scope :conditions => {:state => 1}

新しく作成された UserProjects は、明示的に設定しなくても、すでに状態が 1 に設定されています。

デフォルト スコープの詳細については、http: //apidock.com/rails/ActiveRecord/Base/default_scope/classをご覧ください。

すべてのレコードを検索する必要がある場合に一時的にオフにする方法は次のとおりです: http://apidock.com/rails/ActiveRecord/Scoping/Default/ClassMethods/unscoped

于 2013-06-27T14:02:41.443 に答える