簡體   English   中英

從SQL查詢更改活動記錄查詢

[英]changing an active record query from SQL query

我的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 on rails中使用的東西。 因此,可以引用活動記錄查詢,可能沿着..

@records = Effort.find(:all,:select =>等等...

問題是我似乎無法解決如何做到這一點,因為我是剛接觸紅寶石的新手。

更新資料

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語句的主要區別在於,這將利用JOIN而不只是兩個表之間的條件。 您還應該在列引用之前添加表前綴,以確保不會發生沖突:

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

這未經測試,所以看看它是否如您所願。

如果要使用ActiveRecords在rails中實現sql,則可以使用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,“售前”)

我沒有親自嘗試過,但應該可以

高溫超導

薩梅拉

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM