2012-01-19 69 views
2

我得到了我的结果,但我觉得里面都脏。什么是这种情况下更好的ActiveRecord查询

如何才能更好地获取最近的pay_rate或home_base_assignment start_date,该值是早于还是等于给定日期?

class Employee < ActiveRecord::Base 
    has_many :home_base_assignments 
    has_many :position_assignments 
    has_many :pay_rates, :through => :position_assignments 

    def closest_prior_assignment_start(date) 
    closest_prior_pay_rate_start = 
     pay_rates.where("pay_rates.start_date <= ?", date) 
    .order(:start_date).last.start_date 

    closest_prior_home_base_start = 
     home_base_assignments.where("start_date <= ?", date) 
     .order(:start_date).last.start_date 

    [closest_prior_pay_rate_start, closest_prior_home_base_start].sort!.last 
    end 
end 

Yuck!

回答

0

可以重构方法,使用范围了一下,这里的东西我觉得你添加到模型:

scope :lastest, order("start_date DESC") 

closest_prior_pay_rate_start = 
    pay_rates.where("pay_rates.start_date <= ?", date).latest 

closest_prior_home_base_start = 
    home_base_assignments.where("start_date <= ?", date).latest 
+0

感谢。当然这是一个好主意,但我发布的代码只是为了解释这个问题。我认为真正的问题是如何避免两个查询和使用Ruby数组,当然有一个单一的查询解决方案。 – Blastula

相关问题