すべてフィールドを持つオブジェクトがいくつかありapprovedます。
すべてのモデルで使用するスコープを実装する最良の方法は何ですか?
たとえば、sightingオブジェクトとオブジェクトがありcommentます。どちらも、公開する前に管理者の承認を受ける必要があります。
では、各モデルで繰り返すことcomment.approvedなく、それぞれを返すスコープを作成するにはどうすればよいでしょうか? sighting.approvedこれが懸念の出番ですか?
すべてフィールドを持つオブジェクトがいくつかありapprovedます。
すべてのモデルで使用するスコープを実装する最良の方法は何ですか?
たとえば、sightingオブジェクトとオブジェクトがありcommentます。どちらも、公開する前に管理者の承認を受ける必要があります。
では、各モデルで繰り返すことcomment.approvedなく、それぞれを返すスコープを作成するにはどうすればよいでしょうか? sighting.approvedこれが懸念の出番ですか?
スコープ機能だけが必要な場合は、各モデルでスコープを宣言するだけで問題ありません。を使用する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.approvedてComment.approved、承認されたレコードの適切なリストを取得できます。メソッドも取得し、次のunapproveようなことができますComment.approved.first.unapprove。
この例ではdefault_scope、呼び出しが承認されていないアイテムのみを返すことを意味するものSighting.allも含めました。Comment.all例としてこれを含めましたが、実装には適用できない場合があります。