通过模块共享范围?
我想通过将共享范围移动到模块中来干掉几个模型,例如:
module CommonScopes extend ActiveSupport::Concern module ClassMethods scope :ordered_for_display, order("#{self.to_s.tableize}.rank asc") end end
我还想创建测试模块的共享规范。 不幸的是,当我尝试在模型中包含共享范围时,我得到:
undefined method `order' for CommonScopes::ClassMethods:Module
有任何想法吗? 谢谢!
您可以使用instance_eval
module CommonScopes extend ActiveSupport::Concern def self.included(klass) klass.instance_eval do scope :ordered_for_display, order("#{self.to_s.tableize}.rank asc") end end end
与rails 4 scope语法一样,您只需使用lambda来延迟代码的执行(也可以在rails 3中使用):
module CommonScopes extend ActiveSupport::Concern included do scope :ordered_for_display, -> { order("#{self.to_s.tableize}.rank asc") } end end
因为在您的模块被Ruby解析时会立即调用scope
方法,并且无法从CommonScopes
模块访问它。
但您可以通过类方法替换范围调用:
module CommonScopes extend ActiveSupport::Concern module ClassMethods def ordered_for_display order("#{self.to_s.tableize}.rank asc") end end end
- 自定义ActiveModel full_messages
- 质量分配exception没有找到解释(Rails 3.2.1)
- Rails 3:显示表单的validation错误(不保存ActiveRecord模型)
- ActiveModel :: MassAssignmentSecurity ::错误:无法批量分配受保护的属性
- ActiveModel – View – Rails中的控制器而不是ActiveRecord?
- Rails accepted_nested_attributes计数validation
- 使用acts_as_api属性格式化xml
- ActiveModel方法属性“_was”用于什么?
- Rails – 帮助理解如何使用:dependent =>:destroy