10

すべてフィールドを持つオブジェクトがいくつかありapprovedます。

すべてのモデルで使用するスコープを実装する最良の方法は何ですか?

たとえば、sightingオブジェクトとオブジェクトがありcommentます。どちらも、公開する前に管理者の承認を受ける必要があります。

では、各モデルで繰り返すことcomment.approvedなく、それぞれを返すスコープを作成するにはどうすればよいでしょうか? sighting.approvedこれが懸念の出番ですか?

4

2 に答える 2

16

スコープ機能だけが必要な場合は、各モデルでスコープを宣言するだけで問題ありません。を使用するActiveSupport::Concernと、それが起こると思われる場合に、追加のメソッドを追加することもできます。次に例を示します。

# /app/models/concerns/approved.rb
module Approved
  extend ActiveSupport::Concern

  included do
    default_scope { where(approved: false) }
    scope :approved, -> { where(approved: true) }
  end

  def unapprove
    update_attribute :approved, false
  end
end

class Sighting < ActiveRecord::Base
  include Approved
end

class Comment < ActiveRecord::Base
  include Approved
end

次に、 のような呼び出しを行っSighting.approvedComment.approved、承認されたレコードの適切なリストを取得できます。メソッドも取得し、次のunapproveようなことができますComment.approved.first.unapprove

この例ではdefault_scope、呼び出しが承認されていないアイテムのみを返すことを意味するものSighting.allも含めました。Comment.all例としてこれを含めましたが、実装には適用できない場合があります。

于 2013-01-23T15:57:45.703 に答える