2011-08-03 63 views
1

對不起,我仍然有點用綠色的Ruby on Rails綠色至少可以說,所以我會感激即使被引導在同一個方向。命名範圍/過濾器問題

所以......我有三個數據庫表,我們稱之爲人員,工作和帽子。 我有隻返回做某些工作的人一個範圍:

named_scope :emergency_workers, :include => :job, :conditions => {'jobs.name' => 'Police', 'jobs.name' => 'Fire','jobs.name' => 'paramedic'} 

我有隻返回戴帽子人範圍:

named_scope :hat_wearers, :include => :job, :joins => :hat, :conditions => ["hats.name IS NOT ?", nil] 

我的問題是,我該如何定義農民說,除非他們從事這項特殊工作,否則只向我展示戴帽子的人(如上所述)。所以,我的代碼將返回所有帽子佩戴者和所有農民。

如果使的感覺甚至是舔,但是我會指導非常感謝不知道......

+0

你使用的是Rails 3嗎?這看起來像Rails 2語法。 – Andrew

+0

那麼Rails 3的語法是什麼?謝謝 – Christian

回答

2

我不知道如何構造,作爲一個單一的查詢,但使用Rails 3語法,可以指定給定的範圍,然後創建一個返回兩個範圍的認定獨特的結果的方法:

class People < ActiveRecord::Base 
    ... 
    scope :emergency_workers, joins(:jobs).where('jobs.name IN (?)',['Police','Fire','Paramedic']) 
    scope :hat_wearers, joins(:hats).where('hats.name IS NOT ?', nil) 
    scope :farmers, joins(:jobs).where('jobs.name= ?', 'farmer') 
    ... 

    def hats_and_farmers 
    result = self.class.hat_wearers + self.class.farmers 
    result.uniq 
    end 
    ... 
end 

編輯:

我不知道該怎麼寫SQL做了查找基於三張桌子,但如果喲ü做(按你的意見)只寫:

People.find_by_sql('Your custom from scratch query goes here.') 

參見:http://guides.rubyonrails.org/active_record_querying.html#finding-by-sql

所有從模型調用它的作用是告訴你期待什麼樣的對象的查詢返回,所以Rails會它可以將它們實例化爲可供您使用的對象。沒有SQL是以這種方式爲您預先編寫的。

+0

請參閱上面的編輯 - 如果您知道如何在原始SQL中編寫它,您總是可以使用'.find_by_sql()' – Andrew

0

我建議使用兩個單獨的命名範圍並將它們鏈接在一起。你可以使用現有的hat_wearers範圍,並定義範圍,是以作業的名稱,排除:

named_scope :hat_wearers, :joins => :hat, :conditions => ["hats.name IS NOT ?", nil] 
named_scope :without_worker, lambda{|j| :joins => :job, :conditions => ['jobs.name != ?', j]} 

現在你可以把它們結合在一起,並呼籲person.hat_wearers.without_worker('farmer')以及單獨使用的範圍。

警告:根據您使用的Rails版本,鏈接範圍:連接可能會變得棘手。有幾個人在網上寫了一些關於它的問題,並在這個網站上詢問了它,所以如果你遇到困難,請檢查一下。

+0

如果您鏈接範圍,是否具有附加性?那麼,我會怎麼說讓我看看帽子穿着者*和*農民(即hats.name不是?或jobs.name ='farmer')。 Sooo希望我現在可以寫一行SQL。 – Christian

+0

你被允許編寫SQL。只需編寫People.find_by_sql(*您的完全自定義SQL查詢*) – Andrew