0

私は、結合モデルとして PracticeListing.rb を使用して、User.rb と Practice.rb の間の has_many :through 関連付けを持つ Rails アプリを持っています。

ユーザー.rb

  has_many :practice_listings
  has_many :practices, through: :practice_listings

練習.rb

has_many :practice_listings
has_many :users, through: :practice_listings

PracticeListing.rb

  belongs_to :practice
  belongs_to :user

コントローラーの 1 つで、このスコープ メソッドを onuser.rbで呼び出し、 practice_id を渡します。

 scope :lawyers_by_practice, lambda {|practice_id|
  joins(:practices).
  where( users: {practice_id: practice_id},
         users: {lawyer: true},)

  }

practice_id が使用されていないことを示すログからのクエリ

User Load (1.1ms)  SELECT "users".* FROM "users" INNER JOIN "practice_listings" ON "practice_listings"."user_id" = "users"."id" INNER JOIN "practices" ON "practices"."id" = "practice_listings"."practice_id" WHERE "users"."lawyer" = 't' AND (reputation IS NOT NULL) ORDER BY reputation DESC

目的の結果を得るには、そのスコープ メソッドをどのように記述する必要があるか説明できますか?

現在のモデルのセットアップではuser.practice_ids、特定のユーザーに対して行うことができ、practice_ids ['2','4'] の配列を取得できます。

アップデート

クエリが関連する practice_id を持つユーザーのみを選択することを期待して、この方法を (:practices に参加せずに) 試しましたが、データベース内のすべてのユーザーが返されました。

 scope :lawyers_by_practice, lambda {|practice_id|
  where( users: {practice_id: practice_id},
         users: {lawyer: true},)

  }

私もこの方法を試しました(代わりに :practice_listings に参加することにより)が、すべての practice_listing のエントリを返しました。これも、特定の練習 ID を持つ人だけを使用したいという事実を無視しています。

scope :lawyers_by_practice, lambda {|practice_id|
    joins(:practice_listings).
  where( users: {practice_id: practice_id},
         users: {lawyer: true},)

  }
4

1 に答える 1

1

Userはありません。あるpractice_idだけPracticeListingです。

scope :lawyers_by_practice, lambda {|practice_id|
  joins(:practices,:practice_listings).
  where( practice_listings: {practice_id: practice_id},
     users: {lawyer: true},)

  }
于 2013-05-29T22:08:53.693 に答える