0
我有一個has_many的Rails應用程序:通過User.rb和Practice.rb之間的關聯,以及作爲連接模型的PracticeListing.rb。如何查詢與has_many的關聯:通過
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
並獲得practice_ids的陣列[「2」,「4」]
更新
我試圖這樣(不加盟:實踐)同時希望在查詢只會選擇與相關practice_id的用戶,但它返回的分貝每一位用戶,即使是那些誰沒有實踐
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},)
}
我知道用戶沒有practice_id,但我仍然可以執行'user.practice_ids',這就是爲什麼我感到困惑。無論如何,你的解決方案似乎只是部分工作。如果一個用戶(比如id'55')有兩種做法(比如說practice_ids'[3,12]',並且我們正在查詢使用id爲'3'的練習的用戶,那麼用戶ID 55仍然會返回兩次(因此在視圖中列出了兩次)換句話說,因爲用戶ID 55有兩個practice_ids,所以你的查詢(假設我們正在查詢practice_id 3)正在爲該用戶返回兩個結果。是否清楚?是否可修復? – Leahcim
在Rails 3.2中,你可以在作用域中添加'.uniq'作爲'SELECT DISTINCT',否則就是預期的結果,因爲'join'是一個交叉產品 –
我不認爲我的評論很清楚。如果查詢practice_id 3)爲id 55的用戶返回兩個ActiveRecord關係結果,即使id爲55的用戶只有一次練習用id 3也是如此。我認爲這可能是因爲具有id 55的用戶也有另一種練習(id爲12 ),並且它以某種方式從查詢中返回,即使我們不用查詢ID 12 – Leahcim