すべてフィールドを持つオブジェクトがいくつかあり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
例としてこれを含めましたが、実装には適用できない場合があります。