【问题标题】:Ruby on Rails: How to use scope named 'open'?Ruby on Rails:如何使用名为“open”的范围?
【发布时间】:2012-11-29 09:26:02
【问题描述】:

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

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

为了用 JSON 发送它。类似于json.open @foo.bar.open.count。但是 Rails 将 .open 识别为 Ruby 方法(我猜与打开的文件相关),而不是我的范围(并抛出错误“参数数量错误(0 表示 1)”) .如何强制 Rails 使用我的范围,而不是 Ruby 方法?

【问题讨论】:

  • 你能不能把它命名为稍微不同的名字?
  • @foo.bar 是一个类还是一个对象?它必须是一个类。
  • @oldergod 我认为您的原始答案是正确的。当你删除它时,我正要赞成它。我打算回答同样的问题。
  • @airat-shigapov open 不是ActiveRecord::Base 类 上的保留方法名称,所以这应该不是问题。即,如果您将open 定义为MyClass 的范围,并且MyClass 继承自ActiveRecord::Base,则MyClass.open 应该可以正常工作。
  • @shioyama 我很着急,不确定它是否适合 OP 的问题。我已取消删除,谢谢。

标签: ruby-on-rails ruby ruby-on-rails-3 scope ruby-on-rails-3.2


【解决方案1】:

在 Rails 3 中,scope 和 class method 基本相同。

我认为您正在调用 instance method 而不是 class method。

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

【讨论】:

    【解决方案2】:

    open 不是ActiveRecord::Baseclass 上的保留方法名称,所以这应该不是问题。

    例如:

    class Post < ActiveRecord::Base
      scope :open, :where(:closed => false)
      ...
    end
    
    Post.open
    #=> [#<Post id: 1, closed: false>, #<Post id: 5, closed: false>, ... ]
    

    (@oldergod 发布了类似的内容并删除了他的答案。)

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 2016-04-14
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多