ArgumentError:范围主体需要可调用

时间:2017-01-10 10:20:32

标签: ruby-on-rails redmine

我在插件中定义了以下方法:

class ReArtifactProperties < ActiveRecord::Base
  unloadable

  #attr_accessible :artifact_type

  scope :without_projects, :conditions => ["artifact_type != ?", 'Project']
  scope :of_project, lambda { |project|
    project_id = (project.is_a? Project) ? project.id : project
    {:conditions => {:project_id => project_id}}
  }

2 个答案:

答案 0 :(得分:0)

您的代码有几个问题,其中一些是违反Ruby的语法规则,而另一些则违反了Rails的返回值要求。

您当前错误的原因是语法错误。必须在与lambda方法相同的行中定义lambda的块。

现在,如果您已修复此问题,您将注意到在使用范围后,您的代码将抛出其他异常。原因是范围的返回值应该是ActiveRecord关系,而不仅仅是一个简单的哈希。

因此,您的范围定义应与此类似:

scope :of_project, lambda { |project|
  project_id = (project.is_a? Project) ? project.id : project
  where(:project_id => project_id)
}

现在假设Rails足够聪明,可以弄清楚如何从查询的对象中获取ID,您甚至可以删除其中的project_id逻辑并将范围定义缩小为

scope :of_project, lambda { |project|
  where(:project_id => project)
}

答案 1 :(得分:0)

  

您的代码有几个问题,其中一些是违反Ruby的语法规则,而另一些则违反了Rails的返回值要求。

是的,你对lambda块是正确的

最初的代码是:

scope :of_project, lambda { |project|
    project_id = (project.is_a? Project) ? project.id : project
    {:conditions => {:project_id => project_id}}
  }

更正后,它减少到:

scope :of_project, lambda { |project|
  project_id = (project.is_a? Project) ? project.id : project
  where(:project_id => project_id)
}
  

现在假设Rails足够聪明,可以弄清楚如何从查询对象中获取ID,

了解我从

http://rubyonrails.org/

学到的MVC架构 我如何理解RAILS w.r.t Redmine Tool的核心功能?它使用的mysql默认数据库目前有一个非常庞大的模型结构。可以减少它来理解Rails的核心功能吗?