我有一个带有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},)
}
答案 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},)
}