2011-08-03 13 views
1

申し訳ありませんが、私はまだRuby on Railsで少し控えめに言っていますので、同じ方向に案内されていても感謝します。名前付きスコープ/フィルタ質問

私は3つのDBテーブルを持っています。彼らに人、仕事、帽子を呼んでみましょう。 私は特定の仕事をする人だけを返すスコープを持っている:私は定義しないか、

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

私の質問は次のとおりです。

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

私は帽子をかぶる人だけを返すスコープを持っています「この仕事をしなければ、帽子をかぶった人だけを見せてくれるといい、農夫を言う」と言われています。だから、私のコードはすべての帽子の着用者とすべての農家を返すでしょう。

ないことは意味のさえなめるなりますが、私は指導のために非常に感謝されるだろうかどうかわから...

+0

Rails 3を使用していますか?これはRails 2の構文のようです。 – Andrew

+0

それでは、Rails 3の構文は何ですか?ありがとうございます – Christian

答えて

2

私は、単一のクエリとしてそれを構築するかどうかはわかりませんが、あなたはRailsの3構文を使用して与えられたスコープは、2つのスコープの発見からユニークな結果を返すメソッドを作成して指定することができます。

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 

EDIT:

私は上のベース見つける行うためのSQLを記述する方法がわかりません3つのテーブルが、もしそうならuは(コメントごと)を行うだけで、これを書く:

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

2つの別々の名前付きスコープを使用し、それらを連鎖させることをお勧めします。今、あなたはそれらを一緒に連鎖してperson.hat_wearers.without_worker('farmer')を呼び出すだけでなく、個別のスコープを使用することができます

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

:あなたはあなたの既存のhat_wearersスコープを使用しても除外するジョブの名前を取る範囲を定義することができます。

警告の注意:使用しているRailsのバージョンによっては、結合スコープは次のようになります。結合は扱いにくいことがあります。いくつかの人々がウェブ上でそれについて書いて、このサイトでそれについて尋ねたので、あなたが立ち往生するかどうか確認してください。

+0

スコープを連鎖すると、それでは、帽子を着た人と農家を見せて(つまり、hats.nameはどこですか?またはjobs.name = '農家')、どのようにして私を見せていますか? Soooは、今私はSQLの行を書くことが許されたと思う。 – Christian

+0

あなたはSQLを書くことができます。 People.find_by_sql(*完全なカスタムSQLクエリはここに書いてください*) – Andrew

関連する問題