0

私はRailsでかなり新しいので、これがばかげた質問であっても私を殺さないでください= P

私は次のモデルを持っています:

class Profile < ActiveRecord::Base
has_and_belongs_to_many :sectors
has_and_belongs_to_many :languages

class Sector < ActiveRecord::Base
  has_and_belongs_to_many :profiles
end

class Language < ActiveRecord::Base
  has_and_belongs_to_many :profiles
end

特定のセクターと特定の言語を持つすべてのプロファイルを取得するためのエレガントな方法(可能であればSQL結合などを記述せずに)を探しています。

私はグーグルで検索しましたが、私が見つけたのは1 habtmでそれを行う方法だけですが、2でそれが必要です。

私が持っているのは次のとおりです。

def some_method(sector_id, language_id)
   Sector.find(sector_id).profiles
end

しかし、結合条件をいじったり、SQLを記述したりせずに、language_idでフィルターを追加する方法がわかりません。もちろん、すべて1つのクエリで...これを行うためのクリーンでエレガントな方法はありますか?

ありがとう!

4

2 に答える 2

1

上記の例では、すでに 2 つの SQL リクエストを生成しています。

  1. first Sector.find(#id) (セクター テーブルを選択して、id == #id のレコードを取得します)

  2. 2 番目の .profiles (profiles テーブルを選択して、次のセクターを持つすべてのプロファイルを取得します。この選択では、profiles_selectors.profile_id = レールによって自動的に生成された profile.id の内部結合 profile_selectors が既にあります)

これがあなたが探しているものであることを願っています: (しかし、私は :joins キーを使用します)

class Profile < ActiveRecord::Base
  has_and_belongs_to_many :sectors
  has_and_belongs_to_many :languages

  def self.some_method(language_id, sector_id)
    all(:conditions => ["languages.id = ? and sectors.id = ?", language_id, sector_id], :joins => [:languages, :sectors])
  end
end

このメソッドの結果は 1 つの SQL クエリであり、言語とセクターによってフィルター処理されたプロファイルを取得します。

よろしくお願いします

マテウシュ・ユラシェク

于 2010-11-08T22:26:50.483 に答える
1

これを試して:

Profile.all(:joins => [:sectors, :languages], 
  :conditions => ["sectors.id = ? AND languages.id ?", sector_id, language_id])
于 2010-11-08T22:26:50.940 に答える