2013-05-29 70 views
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},) 

    } 

回答

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

    } 
+0

我知道用戶沒有practice_id,但我仍然可以執行'user.practice_ids',這就是爲什麼我感到困惑。無論如何,你的解決方案似乎只是部分工作。如果一個用戶(比如id'55')有兩種做法(比如說practice_ids'[3,12]',並且我們正在查詢使用id爲'3'的練習的用戶,那麼用戶ID 55仍然會返回兩次(因此在視圖中列出了兩次)換句話說,因爲用戶ID 55有兩個practice_ids,所以你的查詢(假設我們正在查詢practice_id 3)正在爲該用戶返回兩個結果。是否清楚?是否可修復? – Leahcim

+0

在Rails 3.2中,你可以在作用域中添加'.uniq'作爲'SELECT DISTINCT',否則就是預期的結果,因爲'join'是一個交叉產品 –

+0

我不認爲我的評論很清楚。如果查詢practice_id 3)爲id 55的用戶返回兩個ActiveRecord關係結果,即使id爲55的用戶只有一次練習用id 3也是如此。我認爲這可能是因爲具有id 55的用戶也有另一種練習(id爲12 ),並且它以某種方式從查詢中返回,即使我們不用查詢ID 12 – Leahcim