2016-07-13 51 views
1

我怎麼重新寫在軌轉換和優化SQL查詢到的Active Record查詢Rails中4

sqlQuery = "SELECT real_estate_agent_assignment_statuses.assignment_status, 
COUNT(developer_referrals.id) AS rea_count FROM 
real_estate_agent_assignment_statuses LEFT OUTER JOIN developer_referrals ON 
developer_referrals.real_estate_agent_assignment_status_id = 
real_estate_agent_assignment_statuses.id AND developer_referrals.project_id = 
1 AND developer_referrals.developer_staff_id IN (266) WHERE 
real_estate_agent_assignment_statuses.assignment_status IN ('Pending 
Eligibility Check', 'Completed Eligibility Check') AND 
real_estate_agent_assignment_statuses.deleted_at IS NULL GROUP BY 
real_estate_agent_assignment_statuses.assignment_status, 
real_estate_agent_assignment_statuses.rank ORDER BY 
real_estate_agent_assignment_statuses.rank ASC" 

回答

0

我的SQL是生鏽,但我認爲這將讓你開始在活動記錄查詢該SQL查詢。

sql_query1 = RealEstateAgentAssignmentStatus.joins(:developer_referrals) 
              .where(:assignment_status => ['Pending Eligibility Check', 'Completed Eligibility Check']) 
              .group(:assignment_status) 
              .order(:rank) 
              .all 

http://apidock.com/rails/ActiveRecord/QueryMethods

0

設立的情況,你可以做幾乎任何事情的權利scopes和關係。

第一步是定義關係和範圍。我只是猜測你的關係是什麼,但即使完全不同的下面的代碼應該大致顯示它是如何工作:

class DeveloperReferral < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :staff_member 

    scope :with_project, ->(project) { 
    # merging allows you to define conditions on the join 
    joins(:project).merge(Project.where(id: project)) 
    } 

    scope :with_staff_member, ->(staff_member) { 
    # merging allows you to define conditions on the join 
    joins(:staff_member).merge(StaffMember.where(id: staff_member)) 
    } 
end 

class RealEstateAgentAssignmentStatus < ActiveRecord::Base 
    has_many :developer_referrals 

    scope :with_status, ->(status) { where(status: status) } 
    scope :not_deleted, -> { where(deleted_at: nil) } 

    scope :with_project, ->(project) { 
    # merging allows you to define conditions on the join 
    joins(:developer_referrals).merge(
     DeveloperReferral.with_project(project) 
    ) 
    } 

    scope :with_staff_member, ->(staff_member) { 
    # merging allows you to define conditions on the join 
    joins(:developer_referrals).merge(
     DeveloperReferral.with_staff_member(staff_member) 
    ) 
    } 
end 

然後你使用範圍可以建立您的查詢。

project = Project.find(1) 
staff_members = project.staff_members 

statuses = 
    RealEstateAgentAssignmentStatus 
    .with_project(project) 
    .with_staff_member(staff_members) 
    .with_status([ 
     'Pending Eligibility Check', 
     'Completed Eligibility Check', 
     ]) 
    .not_deleted 
    .order(
     # we use `arel_table` so that SQL uses the namespaced column name 
     RealEstateAgentAssignmentStatus.arel_table(:rank), 
    ) 

然後你就可以做你的組/計數:

status_counts = 
    statuses 
    .group(
     # we use `arel_table` so that SQL uses the namespaced column name 
     RealEstateAgentAssignmentStatus.arel_table(:assignment_status), 
     RealEstateAgentAssignmentStatus.arel_table(:rank), 
    ) 
    .count(:id)