Ruby on rails 适用于多个模型的范围

Ruby on rails 适用于多个模型的范围,ruby-on-rails,Ruby On Rails,我有几个对象都有一个approved字段 实现跨所有模型使用的范围的最佳方式是什么 例如,我有一个观察对象和一个注释对象。它们在向公众开放之前都必须经过管理员的批准 那么,如何创建一个范围,分别返回comment.approved和sighting.approved,而不在每个模型上重复?这就是关注点发挥作用的地方吗?如果您只是想要范围功能,那么在每个模型中声明一个范围就可以了。使用ActiveSupport::Concern将使您能够添加其他方法,如果您认为会发生这种情况。下面是一个例子: #

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

实现跨所有模型使用的范围的最佳方式是什么

例如,我有一个
观察
对象和一个
注释
对象。它们在向公众开放之前都必须经过管理员的批准


那么,如何创建一个范围,分别返回
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
#/app/models/concerns/approved.rb
模块批准
扩展ActiveSupport::关注点
包括做
默认范围{where(approved:false)}
范围:已批准,->{where(已批准:true)}
结束
def取消批准
更新属性:已批准,错误
结束
结束
类发现
然后,您可以拨打电话,如
Sighting.approved
Comment.approved
,以获取相应的已批准记录列表。您还可以使用
unapprove
方法,并可以执行类似于
Comment.approved.first.unapprove
的操作


在这个例子中,我还包括了
default\u scope
,这意味着像
Sighting.all
Comment.all
这样的调用将只返回未批准的项目。我将此作为一个示例,它可能不适用于您的实现。

尽管我注意到在连接作用域时,从关注点提取的作用域需要是最后一个作用域。我不太清楚为什么

Comment.existing.approved
当我试着把它当作:

Comment.approved.existing
它默默地失败了

我收回这句话。我正在迁移较旧的代码,并使用带条件的作用域,而不是lambda。当我替换:条件时,范围顺序不再重要

scope :existing, -> { where("real = 1") }
取代

scope :existing, :conditions => "real = 1"

@siekfried,感谢您的编辑,您可能需要添加
config.autoload\u路径。我发现的一个问题是让Desive的当前用户始终关注这些问题。似乎user.rb中的set_current_user方法self.current线程与已批准的关注点之间存在断开连接。当我登录和注销时,它并不总是重新捕获更新的已批准范围。代码示例:包含do if User.current&!User.current.nil?范围:已批准,->{where((1,2,3,4,5,6,7)中的状态id)}其他范围:已批准,->{where((1)中的状态id)}end
在这里找到了答案。不推荐使用不带花括号的
default\u范围
。应该写为
default\u scope{where(:approved=>false)}