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)}