Ruby on rails RubyonRails:如何使用名为';打开';?
我在项目中使用Rails 3.2.8,我想使用名为“open”的范围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方法基本上是一样的 我认为您调用的是实例方法,而
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 shigapovopen
不是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>, ... ]