如何查询与has_many:through的关联

时间:2013-05-29 21:59:21

标签: ruby-on-rails

我有一个带有has_many的Rails应用程序:通过User.rb和Practice.rb之间的关联,将PracticeListing.rb作为连接模型。

User.rb

  has_many :practice_listings
  has_many :practices, through: :practice_listings

Practice.rb

has_many :practice_listings
has_many :users, through: :practice_listings

PracticeListing.rb

  belongs_to :practice
  belongs_to :user

在其中一个控制器中,我在user.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并获取一个exercise_ids数组['2','4']

更新

我尝试了这种方式(没有加入:实践)希望查询只选择具有相关practice_id的用户,但它返回了db中的每个用户,即使那些没有练习的用户

 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},)

  }

1 个答案:

答案 0 :(得分: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},)

  }