Ruby on rails RubyonRails:如何使用名为';打开';?

Ruby on rails RubyonRails:如何使用名为';打开';?,ruby-on-rails,ruby,ruby-on-rails-3,scope,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3,Scope,Ruby On Rails 3.2,我在项目中使用Rails 3.2.8,我想使用名为“open”的范围 scope:open,其中(:closed=>false) 为了用JSON发送它。类似于json.open@foo.bar.open.count。但是Rails将.open识别为Ruby方法(我想与打开的文件相关),而不是我的作用域(并抛出错误“错误数量的参数(0代表1)”) . 我怎样才能强制Rails使用我的作用域而不是Ruby方法呢?在Rails3中,scope和class方法基本上是一样的 我认为您调用的是实例方法,而

我在项目中使用Rails 3.2.8,我想使用名为“open”的范围

scope:open,其中(:closed=>false)

为了用JSON发送它。类似于
json.open@foo.bar.open.count
。但是Rails将
.open
识别为Ruby方法(我想与打开的文件相关),而不是我的作用域(并抛出错误“错误数量的参数(0代表1)”)
. 我怎样才能强制Rails使用我的作用域而不是Ruby方法呢?

在Rails3中,
scope
class方法
基本上是一样的

我认为您调用的是
实例方法
,而不是
类方法

class Foo
  scope :open, where(:closed => false)

  def open
    #instance_method
  end
end
# how to call them
Foo.open # scope/class method
Foo.new.open # instance_method

open
不是
ActiveRecord::Base
类上的保留方法名,因此这应该不是问题

例如:

class Postfalse)
...
结束
邮政公开
#=> [#, #, ... ]

(@oldergod发布了一些类似的东西并删除了他的答案。)

你能不能给它起个稍微不同的名字呢?
@foo.bar
是一个类还是一个对象?“必须是一门课。”奥尔德戈德我认为你原来的答案是正确的。当你删除它的时候,我正要更新它。我打算回答同样的问题。@airat shigapov
open
不是
ActiveRecord::Base
类上的保留方法名,所以这应该不是问题。i、 e.
MyClass.open
如果您将
open
定义为
MyClass
上的一个范围,并且
MyClass
继承自
ActiveRecord::Base
@shioyama我当时很忙,不确定它是否适合OP的问题,那么它应该可以正常工作。我取消了它,谢谢你。
class Post < ActiveRecord::Base
  scope :open, :where(:closed => false)
  ...
end

Post.open
#=> [#<Post id: 1, closed: false>, #<Post id: 5, closed: false>, ... ]