【问题标题】:Scope with join across two models not working in Rails 3.1跨两个模型连接的范围在 Rails 3.1 中不起作用
【发布时间】:2012-07-19 17:35:47
【问题描述】:

我有一个时间跟踪应用程序。

Hour 属于ProjectProject 属于 ProjectStatus,因此有一个字段 project_status_id

现在我想限定我的 Hour 模型以过滤属于具有特定状态的项目的所有时间,例如2.

在我的项目模型中,我有这个范围:

  #project.rb
  scope :continous, where(:project_status_id => '2')

在我的 Hour 模型中,我尝试了以下范围,但它总是返回一个空数组,而且我知道有几个小时可以计算我的标准:

  #hour.rb
  scope :intern, joins(:project) & Project.continous

我也觉得控制台上生成的 SQL 输出看起来有点奇怪:

1.9.2-p180 :003 > Hour.intern
  Hour Load (104.5ms)  SELECT `hours`.* FROM `hours` INNER JOIN `projects` ON `projects`.`id` = `hours`.`project_id`
  Project Load (6.1ms)  SELECT `projects`.* FROM `projects` WHERE (project_status_id <> 2)
  Hour Load (95.9ms)  SELECT `hours`.* FROM `hours` INNER JOIN `projects` ON `projects`.`id` = `hours`.`project_id`
  Project Load (1.0ms)  SELECT `projects`.* FROM `projects` WHERE `projects`.`project_status_id` = 2
  Hour Load (92.6ms)  SELECT `hours`.* FROM `hours` 
 => [] 

为什么有一个WHERE (project_status_id &lt;&gt; 2) 的查询和一个WHERE 'projects'.'project_status_id' = 2 的查询?

他是想把两者相减吗? 任何提示如何使这个范围工作..? 谢谢

【问题讨论】:

    标签: mysql ruby-on-rails activerecord ruby-on-rails-3.1


    【解决方案1】:

    不确定这是否是最优雅的方法,但您可以合并关系对象:

    scope :intern, lambda { joins(:project).merge(Project.continous) }
    

    请注意,我将它包装在 lambda 中,因此在加载应用程序时不会执行 Project.continuous。此外,这是在未来版本的 Rails 中定义范围的首选方式。

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      相关资源
      最近更新 更多