изменение запроса активной записи из запроса SQL - PullRequest
0 голосов
/ 09 ноября 2011

Мой 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 в нечто, что можно использовать в ruby ​​на рельсах. Таким образом, запрос активной записи, на который можно ссылаться, вероятно, в соответствии с ..

@ records = Effort.find (: все,: выберите => и т. Д. *

проблема в том, что я не могу понять, как это можно сделать, поскольку я новичок в ruby ​​on rails.

Обновление

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

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Я предполагаю, что вы используете 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 является то, что при этом будет использоваться JOIN, а не просто условие между двумя таблицами. Вы также должны префикс таблицы ссылки на столбцы, чтобы избежать столкновения:

.group("#{Effort.quoted_table_name}.user_id")

Это не проверено, поэтому посмотрите, работает ли оно так, как вы ожидаете.

0 голосов
/ 09 ноября 2011

Если вы хотите реализовать свой sql в рельсах с ActiveRecords, вы можете использовать scope

Пример:

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

@ records = Effort.all_records (2, «Предпродажа»)

Я не пробовал это лично, но должно работать

НТН

Sameera

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...