1

申し訳ありませんが、控えめに言っても、Ruby on Railsについてはまだ少し環境に配慮しているので、同じ方向に案内されてもありがたいです。

だから...私は3つのDBテーブルを持っています、それらを人、仕事、帽子と呼びましょう。特定の仕事をしている人だけを返すスコープがあります。

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]

私の質問は、「この特定の仕事をしない限り、(上記のように)帽子をかぶっている人だけを見せてください」というスコープをどのように定義するかです。したがって、私のコードはすべての帽子着用者とすべての農民を返します。

それが少しでも意味があるかどうかはわかりませんが、私は指導に非常に感謝します...

4

2 に答える 2

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

編集:

3 つのテーブルに基づいて検索を実行するための 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 はありません。

于 2011-08-03T16:38:13.710 に答える
0

2 つの別々の名前付きスコープを使用し、それらを連結することをお勧めします。既存の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 のバージョンによっては、:join によるスコープの連鎖が難しくなる場合があります。何人かがウェブでそれについて書いたり、このサイトで質問したりしているので、行き詰まったらチェックしてみてください.

于 2011-08-03T19:16:58.637 に答える