2009-12-10 77 views
1

我有我的模型以下關係:把一個條件在許多一對多查詢用ActiveRecord

class Show < ActiveRecord::Base 
    has_many :service_shows 
    has_many :services, :through => :service_shows 
end 

class Service < ActiveRecord::Base 
    has_many :service_shows 
    has_many :shows, :through => :service_shows 
end 

class ServiceShow < ActiveRecord::Base 
    belongs_to :show 
    belongs_to :service 
end 

我想回去查詢所有節目爲給定的服務,有rec_status ='A',但是我的ActiveRecord技能只有三天左右的時間,所以我沒有那麼好。如果我理解正確,我可以簡單地調用service.shows並篩選返回的列表,但我只想從數據庫中檢索我需要的記錄 - 我寧願不浪費處理器時間和記錄上的記錄,不想要。

謝謝!

回答

6

從您的描述來看,這聽起來像是節目有:rec_status列。在此基礎上,我設置了一些樣本數據:

Show.create!(:name => 'One', :rec_status => 'A') 
Show.create!(:name => 'Two', :rec_status => 'B') 

Service.create!(:name => 'Service One') 
Service.create!(:name => 'Service Two') 

Show.first.services = Service.all 
Show.last.services = Service.all 

考慮一個單一的服務就可以了,因爲你提到,取回全部顯示:如果你想選擇的一個子集

service = Service.first 
service.shows 

記錄,您可以用取景器調用延長鏈:

service.shows.all(:conditions => {:rec_status => 'A'}) 

更重要的是,你可以捕捉到這些作爲顯示模式名爲範圍:

class Show < ActiveRecord::Base 
    has_many :service_shows 
    has_many :services, :through => :service_shows 

    named_scope :for_status, lambda {|status_flag| {:conditions => {:rec_status => status_flag}} } 
end 

,然後用它來代替傳遞:conditions哈希:

service.shows.for_status('A') 
相關問題