【问题标题】:Rails 3 scope undefined method `includes_values`Rails 3范围未定义方法`includes_values`
【发布时间】:2011-11-28 16:01:49
【问题描述】:

我的模型有这个范围

  scope :supported, order("name").collect {|m| m.name}.join(", ") 

它会抛出一个错误

NoMethodError: undefined method `includes_values' for "blah, blahblah":String

我认为这是因为我试图将字符串作为 ActiveRecord 对象返回,关于如何修复它的想法?实际上,我已经在视图中使用了此代码,但我认为它在模型中可能会更好,也许不是?

编辑 将其移动到非范围类方法中是可行的

def supported
  order("name").collect {|m| m.name}.join(", ") 
end

这里有一个相关的question,它更好地阐明了scopeself 类方法之间的区别。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    你到底想做什么?,如果你想返回一个字符串,使用类方法。如果你想定义一个可链接的 ARel 范围,那么我总是建议也使用类方法,但有些人更喜欢通过 scope 的“显式”方式。

    def self.supported
      order('name').to_a * ", "
    end
    

    【讨论】:

    • 我正在尝试返回一个字符串,我认为 scope 方法就是这样做的,但后来我得到了错误。
    • no scopes 基本上是为了准备数据库查询。它们是可链接的,如果您尝试对它们使用数组方法,它们将执行查询,但它们希望在定义中总是有一个 ARel 对象,并且总是在调用时返回一个。
    • 在 Rails 3 中,作用域也可以定义为类方法。优点是这些方法的返回值不必是 ARel 对象。
    • Huh Rails API 文档在这方面令人困惑。无论如何,我必须按照您在类方法中的建议将我的代码包装在上面,并且它可以工作。我不能使用你的确切代码,因为我不想将整个对象作为字符串返回,只是 name 属性。
    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2011-04-22
    • 2013-05-20
    • 2012-02-18
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多