Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL查询更改活动记录查询_Sql_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

从SQL查询更改活动记录查询

从SQL查询更改活动记录查询,sql,ruby-on-rails,ruby-on-rails-3,activerecord,Sql,Ruby On Rails,Ruby On Rails 3,Activerecord,我的SQL有点生疏,但我设法得到了这段SQL的工作原理 Select project_id, taskType, user_id, SUM(hours) From project_tasks, efforts where project_tasks.id = efforts.project_task_id and project_tasks.project_id = 2 and project_tasks.taskType = "Pre-Sales" group by user_id 我想知

我的SQL有点生疏,但我设法得到了这段SQL的工作原理

Select project_id, taskType, user_id, SUM(hours) 
From project_tasks, efforts
where project_tasks.id = efforts.project_task_id and project_tasks.project_id = 2 and project_tasks.taskType = "Pre-Sales"
group by user_id
我想知道的是将这个sql语句转换成可以在RubyonRails中使用的东西。因此,可以引用的活动记录查询可能与

@记录=努力。查找:全部,:选择=>等

问题是我似乎无法解决如何做到这一点,因为我是RubyonRails新手

更新

class Effort < ActiveRecord::Base
  belongs_to :project_task
  belongs_to :project
  belongs_to :user
end

class ProjectTask < ActiveRecord::Base
  belongs_to :project
  has_many :efforts
end

我假设您使用的是Ruby on Rails 3,因为这个问题带有标签,所以下面是语法:

 Effort.select('project_id, taskType, user_id, SUM(hours)')
       .joins(:project_task)
       .where(:project_tasks => {:project_id => 2, :taskType => 'Pre-Sales'})
       .group('user_id')
我的解决方案和您的sql语句的主要区别在于,这将利用连接,而不仅仅是两个表之间的条件。还应为列引用添加表前缀,以确保不会发生冲突:

.group{efforce.quoted_table_name}.user\u id


这是未经测试的,所以请查看它是否按预期运行。

如果您想在rails中使用ActiveRecords实现sql,可以使用scope

例:

@记录=努力。所有记录2,售前

我没有亲自尝试过,但应该可以


sameera

为什么不先显示您的项目任务、用户和工作模型定义,我也应该问一下这些定义是否属于或有很多需要。。。为什么taskType CamelCase?我真的不知道。。。好的,我试过你说的,把你的代码改成@records。然后,我尝试使用-。但是它告诉我没有找到关联项目任务?有什么建议吗?对不起,应该添加选择…,SUMhours作为总时数。然后通过rec['total_hours']引用总小时数。就错误而言,连接应该是joins:project\u task。[更新答案]太好了,看看@sameera的答案。如果这是一个常见的查询,那么应该将其放入范围中。
class Effort < ActiveRecord::Base
  belongs_to :project_task
  belongs_to :project
  belongs_to :user

  scope :all_records, lambda { |project_id, task_type
    {
      :select => "project_id, taskType, user_id, SUM(hours) ",
      :from =>  "project_tasks, efforts",
      :where => "project_tasks.id = efforts.project_task_id and project_tasks.project_id =#{project_id} and project_tasks.taskType = '#{task_type}'",
      :group => "user_id" 
    }
  }

end