多种型号的范围

kid*_*rax 9 ruby-on-rails

我有几个对象都有一个approved字段.

在所有模型中实施范围的最佳方法是什么?

例如,我有一个sighting对象和一个comment对象.在向公众提供之前,他们都必须得到管理员的批准.

所以,我怎么可以创建一个返回范围comment.approved以及sighting.approved分别不重复它在每一个模型?这是关注的问题吗?

Mar*_*ach 14

虽然只想在每个模型中声明一个范围,但是如果你只想要范围界定功能的话.使用a 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
Run Code Online (Sandbox Code Playgroud)

然后,您可以拨打电话Sighting.approved,Comment.approved以获取已批准记录的相应列表.你也得到了unapprove方法,可以做类似的事情Comment.approved.first.unapprove.

在这个例子中,我还包括default_scope哪些意味着调用类似Sighting.allComment.all将仅返回未批准的项目.我将此作为示例包含在内,它可能不适用于您的实现.