web-dev-qa-db-ja.com

Rails

アクティビティモデルがあり、それらはLocation_toに属しています

Location.country = Australiaのすべてのアクティビティを選択するにはどうすればよいですか? (例えば)

これをスコープ内で実行できますか?

20
Will

あなたが話している種類のクエリは結合です。次のようなコンソールで、このようなクエリを試すことができます。

Activity.joins(:locations).where('locations.country = "Australia"')

つまり、SQLはそれに関連付けられているすべてのアクティビティと場所を取得し、country = Australiaである場所を見つけて、それらの場所に関連付けられているアクティビティを返します。

これをより再利用可能なスコープにするには、国の変数を使用してモデルに定義します。

scope :in_country, lambda {|country| joins(:locations).where('locations.country = ?',country)}

API docs でこれについて詳しく学ぶことができます。

21
Andrew

最新のRailsバージョンでできること:

_Activity.joins(:location).where(locations: { country: "Australia" })
_

注意してください:

  • それはjoins(:location)の場所(singular)です。これはbelongs_to関係だからです
  • where(…)内の場所(plural)です。これはテーブル名なので

後者は、次の場合に意味します。

_belongs_to :location, class_name: "PublicLocation"
_

クエリは次のようになります。

_ Activity.joins(:location).where(public_locations: { country: "Australia" })
_
46
Nycen

はい、スコープを使用できます。このようなものがアクティビティモデルで機能するはずです。

scope :down_under, 
    joins(:locations).
    where("locations.country = 'Australia')
3
Dave S.