复杂的ActiveRecord查询

时间:2013-04-12 20:51:02

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2

我很难围绕如何构建此查询。我不确定是否应该尝试创建一组范围并尝试链接它们。或者我把它放入类方法?或者我会对两者进行组合吗?如果有人能给我一个简短的例子,它会阻止我跳出窗外,我已经在这个工作了一个多星期了。

class CensusDetail < ActiveRecord::Base  
  belongs_to  :apartment  
  belongs_to  :resident  
end  

class Apartment < ActiveRecord::Base  
  belongs_to :apartment_type  
  has_many  :census_details  
  has_many  :residents, :through => :census_details  
end  

class ApartmentType < ActiveRecord::Base  
  has_many :apartments  
end  

class Resident < ActiveRecord::Base  
  has_many :census_details  
  has_many :apartments, :through => :census_details  
end  

apartment.rent_ready       = boolean value if apartment is ready  
apartment_type.occupany    = the number of allowed occupants in an apartment  
census_detail.status       = either "past", "present", or "new"  
census_detail.moveout_date = date time resident is scheduled to move out 

我需要构建一个执行以下操作的查询:

- if the apartment is rent ready then do the following:  
- pull a list from census_details of all residents set as "current" for each apartment  
  -if the # of residents is less than the value of apartment_type.occupancy for this  
    apartment, then list it as available  
  -if the # of residents is = to the value of apartment_type.occupancy then  
    -does any resident have a scheduled move out date  
      -if not, do not list the apartment  
      -if yes, then list apartment  

提前感谢您的任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

我还没有清理它,但这对我有用,所以我想分享。

apartment_type.rb

class ApartmentType < ActiveRecord::Base
  has_many  :apartments, :dependent => :nullify
end

census_detail.rb

class CensusDetail < ActiveRecord::Base
  belongs_to  :resident_contacts
  belongs_to  :apartments
  scope :get_current_residents,  ->(id) { where("status = ? and apartment_id = ?", "current", id) }
end

apartment.rb,其中大部分工作正在进行中

class Apartment < ActiveRecord::Base  
  belongs_to :apartment_type  
  has_many  :census_details  
  has_many  :residents, :through => :census_details  
  scope :rent_ready,      ->  { where(:enabled => true) }

  def self.available
    available_apartments = []
    rent_ready_apartments = self.rent_ready.all

    rent_ready_apartments.each do |apt|
      tmp = ApartmentType.where('id = ?', apt.apartment_type_id).pluck(:occupancy)
      occupancy = tmp[0]
      current_residents = CensusDetail.get_current_residents(apt.id)
      resident_count = current_residents.count

      if resident_count < occupancy
        available_apartments << apt
      end

      if resident_count = occupancy
        scheduled = false
        current_residents.each do |res|
          if res.moveout_date
            scheduled = true
          end
        end
        if scheduled == true
          available_apartments << apt
        end
      end
    end
    available_apartments
  end
end

代码有点难看,但它到目前为止通过了我的测试。我会编辑我原来的问题,而不是回答,以防有人有更好的方法这样做,但每次我做我的问题都被投票。如果有人知道更好的方式,请告诉我,因为我在应用程序中有大约50个表格,现在它们都被复杂的查询捆绑在一起。